如何在python多处理中跳过错误

时间:2014-07-10 18:37:39

标签: python error-handling multiprocessing

我使用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)]之类的输出 反正有吗?

1 个答案:

答案 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