我使用multiprocessing.Pool.map
运行长期独立作业import multiprocessing
pool = multiprocessing.Pool(multiprocessing.cpu_count())
input_var = [1,2,3]
ris = pool.map(long_function,input_var)
pool.close()
pool.join()
这很有效,但如果我在long_function(2)
中收到错误,我将失去使用long_function(1)
和long_function(3)
获得的所有信息。
有没有办法避免这种情况?
最好的方法是获得ris=[long_function(1), ERROR, long_function(3)]
之类的输出
反正有吗?
答案 0 :(得分:2)
def safe_long_function(*args, **kwargs):
try:
return long_function(*args, **kwargs)
except Exception as e:
return e
你基本上想要捕获抛出的异常,然后返回它们而不是提升它们。 例如
def long_function(x):
if x == 2:
raise Exception("This number is even")
import multiprocessing
pool = multiprocessing.Pool() # default is num CPUs
input_var = [1,2,3]
ris = pool.map(safe_long_function, input_var)
pool.close()
pool.join()
print ris
这将给[1, Exception("This number is even"), 3]
然后您可以执行类似
的操作for result in ris:
if isinstance(result, Exception):
print "Error: %s" % result
else:
print result