Voglio applicare una funzione in parallelo usando multiprocessing.Pool. Il problema è che se una chiamata a una funzione attiva un errore di segmentazione, il Pool si blocca per sempre. Qualcuno ha idea di come posso creare un Pool che rileva quando succede qualcosa di simile e genera un errore?multiprocessing.Pool si blocca se il figlio causa un errore di segmentazione
L'esempio seguente mostra come riprodurre esso (richiede 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
Risolto il problema di segmentazione? Di solito i segoult sono causati da un accesso di memoria non valido, che è un comportamento _undefined_ e non garantito per causare un segfault. –
Nessuna risposta, ma posso dire che joblib.Parallel sembra rimanere per sempre. Da quello che posso dire, non c'è modo di restituire il segfault o aggiungere un timeout "watchdog" in multiprocessing. –
In realtà, forse puoi aggiungere un decoratore di timeout? Come mostrato qui: http://code.activestate.com/recipes/577028/ –