Python: multiprocessing.map: Если один процесс вызывает исключение, почему не вызываются блоки finally других процессов?

Насколько я понимаю, предложения finally должны * всегда * выполняться, если попытка был введен.

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'])

Ожидаемый результат таков, что для каждого x, который выводится отдельно в строке 8, должно быть вхождение «Наконец x».

Пример вывода:

$ 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

Похоже, что исключение, завершающее один процесс, завершает родительский и родственный процессы, даже несмотря на то, что в других процессах требуется дополнительная работа .

Почему я не прав? Почему это правильно? Если это верно, как следует безопасно очищать ресурсы в многопроцессорном Python?

26
задан wkschwartz 4 June 2012 в 07:39
поделиться