我的理解是,如果输入了 try,finally 子句必须*always* 执行。
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'])
预期的输出是对于第 8 行单独打印的每个 x,必须出现“Finally 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 中的资源?