2014-07-10 34 views
0

我用用multiprocessing.Pool.map如何跳過錯誤的python多處理

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)] 這樣的輸出有沒有辦法做到這一點?

回答

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