gpt4 book ai didi

python - 未检测到多处理池中引发的异常

转载 作者:IT老高 更新时间:2023-10-28 21:41:44 25 4
gpt4 key购买 nike

似乎当从 multiprocessing.Pool 进程引发异常时,没有堆栈跟踪或任何其他表明它失败的迹象。示例:

from multiprocessing import Pool 

def go():
print(1)
raise Exception()
print(2)

p = Pool()
p.apply_async(go)
p.close()
p.join()

打印 1 并静默停止。有趣的是,引发 BaseException 反而有效。有没有办法让所有异常的行为都与 BaseException 相同?

最佳答案

也许我遗漏了一些东西,但这不是 Result 对象的 get 方法返回的内容吗?见 Process Pools .

class multiprocessing.pool.AsyncResult

The class of the result returned by Pool.apply_async() and Pool.map_async().get([timeout])
Return the result when it arrives. If timeout is not None and the result does not arrive within timeout seconds then multiprocessing.TimeoutError is raised. If the remote call raised an exception then that exception will be reraised by get().

所以,稍微修改一下你的例子,就可以了

from multiprocessing import Pool

def go():
print(1)
raise Exception("foobar")
print(2)

p = Pool()
x = p.apply_async(go)
x.get()
p.close()
p.join()

结果是什么

1
Traceback (most recent call last):
File "rob.py", line 10, in <module>
x.get()
File "/usr/lib/python2.6/multiprocessing/pool.py", line 422, in get
raise self._value
Exception: foobar

这并不完全令人满意,因为它不打印回溯,但总比没有好。

更新:此错误已在 Python 3.4 中得到修复,由 Richard Oudkerk 提供。查看问题 get method of multiprocessing.pool.Async should return full traceback .

关于python - 未检测到多处理池中引发的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6728236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com