Dies funktioniert nicht so, wie Sie es beabsichtigen, da das Aufrufen von sys.exit()
in einem Arbeitsprozess nur den Worker beendet. Es wirkt sich nicht auf den übergeordneten Prozess oder die anderen Worker aus, da es sich um separate Prozesse handelt und die Erhöhung SystemExit
nur den aktuellen Prozess betrifft. Sie müssen dem übergeordneten Prozess ein Signal senden, um ihm mitzuteilen, dass er heruntergefahren werden sollte. Eine Möglichkeit, dies zu tun für Ihren Anwendungsfall wäre ein Event
in einem multiprocessing.Manager
Server erstellt verwenden:
import multiprocessing
def myfunction(i, event):
if not event.is_set():
print i
if i == 20:
event.set()
if __name__ == "__main__":
p= multiprocessing.Pool(10)
m = multiprocessing.Manager()
event = m.Event()
for i in range(100):
p.apply_async(myfunction , (i, event))
p.close()
event.wait() # We'll block here until a worker calls `event.set()`
p.terminate() # Terminate all processes in the Pool
Ausgang:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Wie in Lukes Antwort darauf hingewiesen, gibt es ein Rennen hier : Es gibt keine Garantie, dass alle Arbeiter in der Reihenfolge laufen, also ist es möglich, dass myfunction(20, ..)
zum Beispiel vor myfuntion(19, ..)
ausgeführt wird. Es ist auch möglich, dass andere Worker nach 20
ausgeführt werden, bevor der Hauptprozess auf das festgelegte Ereignis reagieren kann. Ich habe die Größe des Rennfensters reduziert, indem ich den if not event.is_set():
Aufruf vor dem Drucken i
hinzufüge, aber es existiert noch.
vielen Dank +1 – N3TC4t
Was ist der variable Pool im obigen Code? –
@RajanChaudan Ein Tippfehler! Ich habe es jetzt behoben. – dano