Sauber Python-Multiprozess-Kündigung abhängig von einer exit-flag
Ich bin versucht, erstellen Sie ein Programm mit mehreren Prozessen, und ich würde gerne sauber beenden Sie alle Prozesse hervorgebracht, wenn Fehler auftreten. unten habe ich geschrieben, einige pseudo-Art code für das, was ich glaube ich tun muss, aber ich weiß nicht, was der beste Weg ist, zu kommunizieren, um alle Prozesse, bei denen ein Fehler aufgetreten ist und beendet werden soll.
Ich denke, ich sollte mit Klassen für diese Art der Sache, aber ich bin ganz neu bei Python, so dass ich versuche nur, in meinen Kopf zu kriegen zuerst die Grundlagen.
#imports
exitFlag = True
# Function for threads to process
def url_thread_worker( ):
# while exitFlag:
try:
# do something
except:
# we've ran into a problem, we need to kill all the spawned processes and cleanly exit the program
exitFlag = False
def processStarter( ):
process_1 = multiprocessing.Process( name="Process-1", target=url_thread_worker, args=( ) )
process_2 = multiprocessing.Process( name="Process-2", target=url_thread_worker, args=( ) )
process_1.start()
process_2.start()
if __name__ == '__main__':
processStarter( )
Vielen Dank im Voraus
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist mein Vorschlag:
Müssen Sie ein wrapper-thread für jeden Prozess ausführen, und wartet, für deren Ende.
Wenn ein Prozess beendet wird, überprüfen Sie den exitcode: wenn > 0, d.h. es hob einige nicht behandelte Ausnahme. Jetzt rufen terminate_all (), um zu schließen Sie alle verbleibenden aktiven Prozesse.
Die wrapper-threads werden auch zu beenden, wie Sie abhängig sind, den Prozess ausführen.
Außerdem in Ihrem code, den Sie sind völlig frei, zu nennen proc_manager.terminate_all (), Wann immer Sie wollen. Sie können die überprüfung für einige flags in einem anderen thread oder sowas..
Hoffe, es ist gut für Ihren Fall.
PS: btw.. in deinem ursprünglichen code hast du so etwas wie eine Globale exit_flag: Sie können nie ein "global" exit_flag in multiprocessing, weil es einfach ist nicht global, wie Sie mit getrennte Verfahren mit getrennten Speicherbereichen. Das funktioniert nur in der threaded-Umgebungen, in denen der Staat geteilt werden können. Wenn Sie es brauchen, in multiprocessing dann müssen Sie explizite Kommunikation zwischen Prozessen (Rohr und Warteschlange erreichen, dass) oder so etwas wie shared memory Objekte
Wenn Sie möchten, dass Ihre Kind-Prozesse werden automatisch beendet, wenn der Vaterprozess beendet; man könnte Sie dem dämonischen (set
.daemon=True
vor.start()
), d.h., wenn die Eltern einen Fehler erkennt; es kann nur beenden -- die Kinder wird gesorgt sein.Wenn Sie möchten, dass Kinder, die zu bereinigen nach sich selbst; Sie könnte verwenden Sie
multiprocessing.Event()
als ein globales flag: