将ThreadPoolExecutor与映射一起使用时出错



我注意到,当ThreadPoolExecutor((调用函数(x(时,当函数(x(内部出现错误时,我的代码不会输出错误或中断:

import concurrent.futures
def function(x):
# do sth invalid such as
x = y + 1 #there is no y variable
input_list = [1,2,3]
with concurrent.futures.ThreadPoolExecutor() as executor: 
executor.map(function,input_list)  

如何使用map((而不是submit((为执行器获取错误输出?

executor.map返回一个可迭代,必须对其进行迭代才能获得单独的结果,包括可能引发的任何异常:

import concurrent.futures
def function(x):
# do sth invalid such as
if x == 2:
raise ValueError("I don't like 2")
return x, x ** 2
input_list = [1,2,3]
with concurrent.futures.ThreadPoolExecutor(3) as executor:
results = executor.map(function,input_list)
try:
for x, return_value in results:
print(f'{x} ** 2 = {return_value}')
except Exception as e:
print(e)

打印:

1 ** 2 = 1
I don't like 2

或者,您可以使用以下方法进行稍微不同的迭代并获得相同的结果:

import concurrent.futures
def function(x):
# do sth invalid such as
if x == 2:
raise ValueError("I don't like 2")
return x, x ** 2
input_list = [1,2,3]
with concurrent.futures.ThreadPoolExecutor(3) as executor:
results = executor.map(function,input_list)
while True:
try:
x, return_value = next(results)
except StopIteration:
break
except Exception as e:
print(e)
else:
print(f'{x} ** 2 = {return_value}')

但是,如果使用包multiprocessing.pool中的类ThreadPool,则可以获得所有结果,也就是说,获得可能引发的任何异常之外的结果(使用imap(:

from multiprocessing.pool import ThreadPool
def function(x):
# do sth invalid such as
if x == 2:
raise ValueError("I don't like 2")
return x, x ** 2
input_list = [1,2,3]
with ThreadPool(3) as executor:
results = executor.imap(function,input_list)
while True:
try:
x, return_value = next(results)
except StopIteration:
break
except Exception as e:
print(e)
else:
print(f'{x} ** 2 = {return_value}')

打印:

1 ** 2 = 1
I don't like 2
3 ** 2 = 9

最新更新