我想知道在使用multiprocessing模块执行函数时,出现异常时获取堆栈跟踪的最佳方法。以下是一个示例:
import multiprocessing
def square(x):
raise Exception("Crash.")
return x**2
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=4)
results = pool.map_async(square, range(5))
for result in results.get():
print result
这将打印:
Traceback (most recent call last):
File "/extra/workspace/Playground/src/multiproc/multiproc_debug.py", line 11, in <module>
for result in results.get():
File "/extra/Python 2.6/lib/python2.6/multiprocessing/pool.py", line 422, in get
raise self._value
Exception: Crash.
所以没有有用的堆栈跟踪,这相当令人恼火。我目前的解决方案是:
import multiprocessing
import traceback
def square(x):
try:
# some more code...
raise Exception("Crash.")
except Exception, exception:
print exception
traceback.print_exc()
raise
return x**2
有没有一种方法可以获得这种行为而不需要所有的样板代码?如果没有,为什么不包括这个功能?
编辑:可以使用装饰器来简化样板代码,但我不知道标准库是否包含这样的装饰器?