[python] multiprocess problem se sirotkem

Petr Messner petr.messner na gmail.com
Středa Září 5 10:45:53 CEST 2012


Ahoj,

můžeš nějak zjistit, jak a čím je ten proces zabit? Třeba přes strace nebo gdb.

Jednoduchý CGI skript, který spustí něco časově delšího přes
subprocess.Popen (ale samozřejmě nejoinuje) a hned se ukončí, mi
funguje a proces na pozadí zůstane běžet. Ale záleží na tom, co s tím
dělá ještě ten server. Můžeš sem poskytnout nějaký konkrétní příklad,
který se dá spustit a vykazuje to tu chybu? Včetně toho, jak přesně se
to spouští. Může to být nějaký detail, okolo procesů v unixu jsou
ještě věci jako process group, připojená konzole, session leader...
Pak se musejí dělat double forky a podobné srandy.

Jinak, abych to shrnul, už se tu asi zmínily všechny obecnější
způsoby, jak to řešit:

1) CGI skript uloží někam informace o tom, že je potřeba něco udělat a
nechá to na něčem jiném. To něco jiného, které tyto joby provádí, může
být:
1.1) nějaký proces, který neustále monitoruje, zda není nějaký nový
job a pokud ano, tak to provede; toto lze zkomplikovat více workery,
chytřejší (push místo pull) detekcí jobu - místo typické databáze lze
použít message brokery (např. RabbitMQ) atd.
1.2) cron script, který dělá to samé jako 1.1), jen to není
dlouhoběžící proces. Tohle je asi nejjednodušší, pokud nevadí vyšší
latence (spouštění jednou za minutu) a pokud ten skript při spouštění
nebere příliš hodně CPU nebo I/O.
1.3) použití nějakého softwaru pro task queue, který je určen právě
pro tyto situace, např. již zmíněné Celery

2) Spouštět proces přímo z CGI skriptu, jak píšeš. Zde bych ale uvedl
pár nevýhod:
- jak je vidět, někdy to nefunguje kvůli nějakým detailům ohledně
ukončování procesů :)
- obecně se nepočítá s tím, že po ukončení zpracování požadavku ještě
něco zbyde. To může přinášet problémy třeba při restartu.
- není kontrola nad tím, kolik takových procesů se vlastně spustí,
mohou dojít prostředky, výrazně to usnadňuje DoS útoky. U řešeních
popsaných v 1) lze relativně snadno kontrolovat, kolik workerů bude ty
joby zpracovávat, případně nějak monitorovat jejich prostředky.
- prostě mi to nepřijde jako elegantní řešení problému, spíš jako hack :)

Zdar

PM


Dne 5. září 2012 9:50 Tomas Pelka <tompelka na gmail.com> napsal(a):
> Zdravim vsechny,
>
> resim nasledujici problem a verim, ze mi nekdo z vas pomuze.
>
> Potrebuji z cgi skriptu (interpretuje jej jednoduchy httpserver) pustit
> dlouho bezici ulohu ale tak abych nemusel volat mutiprocess.join(), protoze
> pak stranka zustane viset. Jak jsem zminil pouzivam k tomu multiprocess,
> ktery pouze nastartuji ale nejoinu. Vse ale nasvercuje tomu, ze proces je
> zabyt i kdyz by mel byt daemonem.
>
> import multiprocess
>
> mp = Process(target=__handle_execution, args=(args,))
> mp.daemon = True
> mp.start()
>
> -- zde je konec cgi skriptu --
>
> Ma nekdo s podobnym chovanim zkusenosti?
>
> Diky
>
> --
> Tomas Pelka
>
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python


Další informace o konferenci Python