Python: multiprocessing.anzeigen: Wenn ein Prozess eine Ausnahme auslöst, warum sind nicht andere Prozesse' finally-Blöcke genannt?

Mein Verständnis ist, dass endlich Klauseln muss *immer* ausgeführt werden, wenn die versuchen, eingegeben wurde.

import random

from multiprocessing import Pool
from time import sleep

def Process(x):
  try:
    print x
    sleep(random.random())
    raise Exception('Exception: ' + x)
  finally:
    print 'Finally: ' + x

Pool(3).map(Process, ['1','2','3'])

Erwartete Ausgabe ist, dass für jedes x welches gedruckt wird, auf seine eigene, indem Sie die Linie 8, es muss werden, ein vorkommen von 'Endlich x'.

Beispiel-Ausgabe:

$ python bug.py 
1
2
3
Finally: 2
Traceback (most recent call last):
  File "bug.py", line 14, in <module>
    Pool(3).map(Process, ['1','2','3'])
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 225, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 522, in get
    raise self._value
Exception: Exception: 2

Scheint es, dass eine Ausnahme die Beendigung eines Prozesses beendet die Eltern und Geschwister Prozesse, auch wenn es weitere Arbeit erforderlich zu tun, die in anderen Prozessen.

Warum bin ich da falsch? Warum ist dies richtig? Wenn dies korrekt ist, wie sollte man sicher bereinigen von Ressourcen, die in Multiprozess-Python?

Schreibe einen Kommentar