Wie zu töten alle Pool-Arbeiter in Multiprozess?
Ich soll aufhören alle threads, die von einem einzigen Arbeiter.
Ich habe einen thread-pool mit 10 Arbeitnehmern:
def myfunction(i):
print(i)
if (i == 20):
sys.exit()
p = multiprocessing.Pool(10, init_worker)
for i in range(100):
p.apply_async(myfunction, (i,))
Mein Programm nicht halt und die anderen Prozesse weiter arbeiten, bis alle 100 Iterationen abgeschlossen sind. Ich will stoppen Sie den pool vollständig aus dem inneren der thread, der nennt sys.exit()
. Wie es derzeit geschrieben wird, halt nur die Arbeiter, die Anrufe sys.exit()
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Funktioniert das nicht die Weise, die Sie beabsichtigen, da ruft
sys.exit()
in einem worker-Prozess wird nur beendet der Arbeiter. Es hat keine Auswirkungen auf die übergeordnete Prozess-oder andere Arbeitnehmer, weil Sie in separaten Prozessen und die Sensibilisierung derSystemExit
wirkt sich nur auf den aktuellen Prozess. Sie müssen senden Sie ein signal zurück, dass der übergeordnete Prozess zu sagen, dass es Herunterfahren. Ein Weg dies zu tun für Ihre use-case wäre, eineEvent
erstelltmultiprocessing.Manager
server:Ausgabe:
Wie bereits in Luke ' s Antwort, es ist ein Rennen hier: Es gibt keine Garantie, dass alle Arbeiter laufen in der Reihenfolge, es ist also möglich, dass
myfunction(20, ..)
laufen vormyfuntion(19, ..)
zum Beispiel. Es ist auch möglich, dass andere Arbeitnehmer nach20
betrieben werden kann, bevor die wichtigsten Verfahren handeln können, auf die Veranstaltung eingestellt. I reduziert die Größe der Rasse Fenster, indem dieif not event.is_set():
Anruf vor Drucklegungi
, aber es existiert noch.Können Sie nicht tun.
Selbst wenn Sie in der Lage waren zu Ende, alle Ihre Prozesse, wenn
i == 20
Sie konnte sich nicht sicher sein, dass nur 20 zahlen gedruckt wurden, weil Ihre Prozesse ausgeführt wird, in einer nicht-deterministischen Reihenfolge.Wenn Sie wollen nur laufen 20 Prozesse, dann müssen Sie zum verwalten Sie diese aus Ihrer master-Prozess (dh. Ihre Regelkreis).