Wenn ich mit Multiprocessing-Pool ausgeführt werde, finde ich, dass der Worker-Prozess über einen Punkt hinausläuft, wo eine Ausnahme ausgelöst wird.Python-Multiprozessing beendet nicht auf Basis Ausnahme
Betrachten Sie den folgenden Code ein:
import multiprocessing
def worker(x):
print("input: " + x)
y = x + "_output"
raise Exception("foobar")
print("output: " + y)
return(y)
def main():
data = [str(x) for x in range(4)]
pool = multiprocessing.Pool(1)
chunksize = 1
results = pool.map(worker, data, chunksize)
pool.close()
pool.join()
print("Printing results:")
print(results)
if __name__ == "__main__":
main()
Die Ausgabe lautet:
$ python multiprocessing_fail.py
input: 0
input: 1
input: 2
Traceback (most recent call last):
input: 3
File "multiprocessing_fail.py", line 25, in <module>
main()
File "multiprocessing_fail.py", line 16, in main
results = pool.map(worker, data, 1)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/lib/python2.7/multiprocessing/pool.py", line 558, in get
raise self._value
Exception: foobar
Wie Sie sehen können, der Arbeitsprozess geht nie über raise Exception("foobar")
in die zweite print-Anweisung. Zu Beginn von function worker() wird die Arbeit jedoch immer wieder fortgesetzt.
Ich suchte nach einer Erklärung in der Dokumentation, konnte aber keine finden. Hier ist eine potenziell im Zusammenhang SO Frage:
Keyboard Interrupts with python's multiprocessing Pool
Aber das ist anders (über Tastatur-Interrupts nicht durch den Master-Prozess aufgenommen werden).
Eine andere Frage SO:
How to catch exceptions in workers in Multiprocessing
Diese Frage ist auch anders, da darin der Master-Prozess jede Ausnahme doesnt zu fangen, während hier der Master die Ausnahme (Linie 16) fangen haben. Noch wichtiger ist, dass der Arbeiter in dieser Frage nicht über eine Ausnahme hinausgelaufen ist (es gibt nur eine ausführbare Linie für den Arbeiter).
Am laufenden Python 2,7
Mögliche Duplikat von [Wie fangen Ausnahmen bei Arbeitern in Multi] (http://stackoverflow.com/questions erwarten/22094852/how-to-catch-Ausnahmen-in-Worker-in-Multiprocessing) – jordanm
@jordanm danke für die schnelle Antwort! Ich habe diese Frage gelesen und fand sie anders als meine. Bearbeitet um Unterschiede hervorzuheben. – akshan
Es scheint nicht ausgeführt zu werden, hat die Ausnahme bestanden. Die Zeichenkette "output:" wird nie gedruckt. Es scheint, dass nachdem die Ausnahme ausgelöst wird und sie stirbt, sie nur einen neuen Arbeiter hervorbringt. – jordanm