[Python-de] Prozesse mit Thread beenden

Diez Roggisch deets at web.de
Di Nov 8 14:27:45 CET 2011


On 11/8/11 4:15 PM, "Florian Lindner" <mailinglists at xgm.de> wrote:

>Am Samstag 05 November 2011, 21:00:26 schrieb Christopher Arndt:
>> On 05.11.2011 10:44, Florian Lindner wrote:
>> > Ok, das ist klar. Die Frage ist nur, wie merkt der Thread, dass sein
>> > letztes Stündlein geschlagen hat? Kann ich also irgendwie eine Art
>> > Signal Handler installieren, worin der Thread noch Aufräumarbeiten
>> > erledigen kann oder muss das per Hand gemacht werden? Mit normalen
>>Unix
>> > Signals geht das ja nicht, soweit ich weiß.
>> 
>> Threads enden, wenn ihre run() Methode zurückkehrt.
>
>Hallo,
>
>ich sehe nicht, wie weit das mir weiterhilft.
>
>Das Problem stehe ich eher so. Ich habe folgenden Aufrufbaum:
>
>execute(): Methode (=Thread) im XML-RPC Server
>-> mache_dies()
>   -> mache_nochwas()
>      -> proc = subprocess.Popen(...)
>
>Wenn ich nun in execute() die Information bekomme, dass der Thread
>beendet 
>wird, muss ich diese Information immer noch soweit nach unten reichen,
>dass 
>proc.kill() aufgerufen werden kann. Es muss also über alle Aufrufebenen
>irgendwie ein Callback-Mechanismus vorhanden sein.
>
>Sorry, wenn ich nicht so recht verstehe, was Du meinst... ;-)

Was machst du denn mit proc? Wenn du darauf natuerlich "communicate" oder
sowas aufrufst, dann ist essig.

Aber wenn du eine Warteschleife baust, die periodisch nach dem
Prozess-Status fragt, und gleichzeitig deine Abbruchbedingung prueft, dann
bist du schon einen Schritt weiter.

Dann ist die Frage, wie die Abbruchbedingung reinkommen soll. Auch via
XMLRP? Dann wirst du einen eigenen Thread starten muessen, welcher die
Behandlung von proc macht, damit der XMLRPC-Thread zurueckkehren kann, und
weitere Verbindungen entgegennehmen kann.

Oder du hast mehrere XMLRPC-Threads - aber das birgt natuerlich die
Gefahr, dass alle von denen im Subprocess feststecken. Einen richtiges
Worker-Modell ala Apache MP oder MT ist AFAIK nicht ohne groesseren
Aufwand drin.

Damit waeren wir dann natuerlich bei noch einer Loesung - du laesst den
XMLRPC-Server via Apache laufen, der hat dann viele Prozesse, und somit
kann auch die Abbruchbedingung kommuniziert werden.

Das muss dann aber natuerlich so passieren, dass du zB eine Datenbank oder
ein globales File verwendest, denn die verschiedenen Prozesse wollen ja
auch synchronisiert werden.

Diez




Mehr Informationen über die Mailingliste python-de