gpt4 book ai didi

python - 工作进程中的异常

转载 作者:太空宇宙 更新时间:2023-11-03 15:21:08 24 4
gpt4 key购买 nike

我正在使用 Python 进行多处理。我试图确定如果工作人员引发异常会发生什么,因此我编写了以下代码:

def a(num):
if(num == 2):
raise Exception("num can't be 2")
print(num)


p = Pool()
p.map(a, [2, 1, 3, 4, 5, 6, 7, 100, 100000000000000, 234, 234, 5634, 0000])

输出

3
4
5
7
6
100
100000000000000
234
234
5634
0
multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
File "/usr/lib/python3.5/multiprocessing/pool.py", line 119, in worker
result = (True, func(*args, **kwds))
File "/usr/lib/python3.5/multiprocessing/pool.py", line 44, in mapstar
return list(map(*args))
File "<stdin>", line 3, in a
Exception: Error, num can't be 2
"""

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/multiprocessing/pool.py", line 260, in map
return self._map_async(func, iterable, mapstar, chunksize).get()
File "/usr/lib/python3.5/multiprocessing/pool.py", line 608, in get
raise self._value
Exception: Error, num can't be 2

如果你可以看到打印的数字“2”不在那里,但为什么数字1也不在那里?

注意:我在 Ubuntu 上使用 Python 3.5.2

最佳答案

默认情况下,Pool 创建的工作线程数量等于您的核心数量。当这些工作进程之一终止时,它可能会导致分配给它的工作未完成。它还可能将输出留在永远不会被刷新的缓冲区中。

.map() 的模式是处理工作线程中的异常并返回一些合适的错误值,因为 .map() 的结果应该是与输入一对一。

from multiprocessing import Pool

def a(num):
try:
if(num == 2):
raise Exception("num can't be 2")
print(num, flush=True)
return num
except Exception as e:
print('failed', flush=True)
return e

p = Pool()
n=100
results = p.map(a, range(n))

print("missing numbers: ", tuple(i for i in range(n) if i not in results))

这是另一个问题,其中包含有关 how exceptions propagate in multiprocessing.map workers 的详细信息.

关于python - 工作进程中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43542501/

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