2017-01-19 5 views
1

Ich habe ein ziemlich einfaches Programm, dass jede Aufgabe in der Taskq ausgeführt und etwas berechnet, sagen wir für 30 Sekunden. Diese Aufgabe läuft nicht in irgendeiner Art von while oder for-Schleife.Python - Stoppen einer lang laufenden Taskq Thread

def run(self): 
    while not self.stopper.is_set(): 
     DO_MY_30_SECONDS_WORK(self) 
     self.task_done() 

Nun vorausgesetzt, ich habe ein thread.event und dies kann überprüfen, bevor/nachdem die Aufgabe erledigt ist. Aber gibt es eine Möglichkeit, dem bereits laufenden Thread mitzuteilen, dass er die Ausführung stoppen oder beenden soll.

+0

Ich hatte ein Problem wie Ihr letztes Jahr und verwendete SIGNALs, um das Problem zu behandeln. Sie können einen anderen Thread mit Ihrem Hauptthread starten und einen Zeitzähler im Hilfsthread starten. Wenn der Zähler endet, gibt er dem Hauptfaden ein Signal und tötet ihn, indem er Signale empfängt. Vielleicht möchten Sie [this] ansehen (https://pymotw.com/2/signal/) – cengineer

+0

ist Ihre Aufgabe etwas Python-Code, oder ist es ein anderes Programm, das Sie mit 'subprocess' ausführen? – hansaplast

+0

Es ist nur Python-Code, aber vielleicht mit Curl Calls .. – Jay

Antwort

1

Es gibt keine Möglichkeit, den laufenden Thread zu stoppen, wenn DO_MY_30_SECONDS_WORK(self) blockiert wird. Nun, man könnte es als daemon Thread festlegen, und es wird abrupt beendet, wenn die Hauptprogrammausführung beendet ist, dies würde Probleme verursachen, wenn der Thread tatsächlich Ressourcen hält (zB Schreiben in eine Datei) und im Allgemeinen keine gute Idee ist ein Thread.

Was Sie tun könnten ist, DO_MY_30_SECONDS_WORK(self) neu zu gestalten und es nicht blockierend zu machen, was bedeutet, die Arbeit in kleine Stücke zu schneiden und es für das Stoppschild in einem vernünftigen Intervall zu überprüfen, damit Ihr Thread genug reagiert beende dich, wenn du es sagst.

+0

stoppen Danke ... Yup, das ist, was ich anstrebe. Ich schneide es nur in kleinere Stücke. – Jay

Verwandte Themen