我想使用multiprocessing.Pool並行應用函數。 問題是,如果一個函數調用觸發了分段錯誤,則該池永遠掛起。 有沒有人有一個想法,我怎樣才能使一個池,檢測什麼時候這樣的事情發生並引發錯誤?multiprocessing.Pool掛起,如果子項導致分段錯誤
下面的示例演示如何重現它(需要scikit學習> 0.14)
import numpy as np
from sklearn.ensemble import gradient_boosting
import time
from multiprocessing import Pool
class Bad(object):
tree_ = None
def fit_one(i):
if i == 3:
# this will segfault
bad = np.array([[Bad()] * 2], dtype=np.object)
gradient_boosting.predict_stages(bad,
np.random.rand(20, 2).astype(np.float32),
1.0, np.random.rand(20, 2))
else:
time.sleep(1)
return i
pool = Pool(2)
out = pool.imap_unordered(fit_one, range(10))
# we will never see 3
for o in out:
print o
修復分段錯誤?通常,段錯誤是由無效的內存訪問引起的,這是_undefined_行爲,並且根本不保證會導致段錯誤。 –
沒有答案,但我可以說joblib.Parallel似乎永遠掛起。從我可以告訴的是,沒有辦法返回segfault或在多處理中添加「看門狗」超時。 –
其實,也許你可以添加一個超時裝飾器?如顯示在這裏:http://code.activestate.com/recipes/577028/ –