Я хочу применить функцию параллельно с использованием multiprocessing.Pool. Проблема в том, что если один вызов функции вызывает ошибку сегментации, пул вешает навсегда. Кто-нибудь знает, как я могу создать пул, который обнаруживает, когда что-то подобное происходит и вызывает ошибку?
В следующем примере показано, как воспроизвести его (требуется scikit-learn > 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