[Python-de] Prozesse mit Thread beenden

Florian Lindner mailinglists at xgm.de
Do Nov 10 15:52:29 CET 2011


Hallo,

hier mal die Info, wie die ganze Sache in Wirklichkeit ausschaut:

def run(self) # ist über register_instance eines threaded XML-RPC Server
als RPC Methode registriert.
   self.w_stack.execute()
   self.server.shutdown()

def abort(): # Ebenfalls wie run()
   self.w_stack.abort()
   self.server.shutdown()


def w_stack.abort():
        self._sig_abort.set()   # Ein threaded.Signal
        if self._running_worker:
            self._running_worker.abort()

def abort(self):   # ist _running_worker.abort
        try:
            if self.popen.poll():
                self.popen.kill()
                logger.info("Killing subprocess of worker %s.", self.name)
        except AttributeError:
            pass

Ich hoffe, das ist so einigermaßen verständlich.

Der Prozess selber (also self.popen) wird schon synchron gestartet
(momentan über popen.wait(), aber das werde ich gleich mal auf
communicate() ändern, siehe der andere Thread von mir).

Da abort() initial über den threaded XML-RPC Server aufgerufen wird, ist es
kein Problem, dass das Programm blockiert, solange der Subprocess läuft.

Die obige Konstruktion funktioniert, freue mich natürlich aber über
Verbesserung oder Hinweise, wo es noch harken könnte.

Am liebsten wäre es mir natürlich, wenn ich die ganzen abort() Aufrufe
nicht per Hand durchreichen müsste, sondern der popen sich automatisch
killt, wenn der Thread beendet wird.

Aufwändigere Methoden lohnen sich wohl bei mir nicht.

Grüße,

Florian


Am 8. November 2011 14:27 schrieb Diez Roggisch <deets at web.de>:

> 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
>
>
> _______________________________________________
> python-de maillist  -  python-de at python.org
> http://mail.python.org/mailman/listinfo/python-de
>
-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <http://mail.python.org/pipermail/python-de/attachments/20111110/0c41dba0/attachment.html>


Mehr Informationen über die Mailingliste python-de