使用多处理时获取堆栈跟踪的最佳方法是什么?

nik*_*kow 17 python 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
Run Code Online (Sandbox Code Playgroud)

这打印:

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.
Run Code Online (Sandbox Code Playgroud)

所以没有有用的堆栈跟踪,这非常烦人.我目前的解决方案:

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
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有所有样板代码的情况下获得此行为?如果没有,不包括此功能的原因是什么?

编辑:可以使用装饰器作为样板代码,但我不知道这样的装饰器是否包含在标准库中?

Ned*_*der 11

看起来您应该避免从主函数中引发异常.相反,您可以捕获它,将其视为返回主程序的值,然后将其提升到那里. 在Python中重新抛出异常有更多细节.