Avatar billede tommy_carstensen Nybegynder
07. januar 2012 - 22:12 Der er 5 kommentarer og
1 løsning

python, fork, cgi, subrutine, timeout, parent, child, stdout

Jeg har en html-formular, hvorfra jeg bruger input til at lave beregninger. Beregningerne varer lidt tid, saa jeg vil gerne give brugeren et hurtigt output og lade en child process koere jobbet, der tager lidt laengere tid, uden at brugeren skal vente paa serveren og risikere en timeout. Hvordan goer jeg det? Jeg har foelgende kode, men det virker ikke.

pid = os.fork()
if pid:
    ## hurtigt/temporaert output
    sys.stdout.flush()
    os.close(0)

os.close(1)
os.close(2)
## langsomt/permanent output

Jeg fandt mit gamle spm her, men den loesning, som jeg selv gav (ovenstaaende), virker ikke:
http://www.eksperten.dk/spm/682603
Avatar billede arne_v Ekspert
07. januar 2012 - 22:26 #1
Saa du forker en process der laver beregningerne.

Hvordan skulle resultatet komme fra den process og over til en ny request?
Avatar billede tommy_carstensen Nybegynder
07. januar 2012 - 22:32 #2
Parent skriver en html-side, der refererer til en anden html-side, som bliver skrevet af child.
Avatar billede arne_v Ekspert
07. januar 2012 - 22:40 #3
Ikke nogen koen loesning.

Men det boer virke.

Hvad er det som ikke virker?
Avatar billede tommy_carstensen Nybegynder
08. januar 2012 - 09:03 #4
Jeg faar en fejl 500, naar jeg har:
os.close(1)
os.close(2)

Uden de to linier er forbindelsen mellem server og browser imidlertid aaben indtil beregningen er faerdig, eller timeout bliver ramt.

Jeg har ogsaa proevet at rykke sys.stdout.flush() op foer os.fork().

Jeg kan bruge alle loesninger. Koenne som grimme. Jeg vil bare have det til at virke. Jeg havde et stykke kode, der virkede, men det ligger selvfoelgelig paa en server, som jeg ikke laengere har adgang til.
Avatar billede tommy_carstensen Nybegynder
08. januar 2012 - 09:08 #5
Jeg var traet i gaar og vist ikke helt vaagen her til morgen. Foelgende kode virker:

    pid = os.fork()
    if pid:
        print 'Content-type: text/html\n\n'
        print '<body"></body>'
        sys.stdout.flush()
        os.close(0)
        a=1

    os.close(1)
    os.close(2)
    ## langsomt/permanent output

Jeg havde glemt rent faktisk at erstatte ## hurtigt/temporaert output med nogle print statements. Doh! Laegger du et svar? Tusind tak for hjaelpen. Det var godt, at du bekraeftede, at det burde virke, saa jeg kastede et ekstra blik paa det. Tak :-)
Avatar billede arne_v Ekspert
09. januar 2012 - 02:57 #6
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester