Birden çok işlem kullanarak paralel olarak bir işlev uygulamak istiyorum. Sorun, bir işlev çağrısı bir segmentasyon hatası tetiklerse, Havuzun sonsuza kadar askıda kalmasıdır. Böyle bir şey olduğunda ne olduğunu algılayan ve bir hata meydana getiren bir Havuz'u nasıl oluşturabileceğimi bilen var mı?çok işlemli. Çocuk segmentasyon hatasına neden oluyorsa kilitleniyor
Aşağıdaki örnek bunu yeniden nasıl gösterir (gerektirir scikit-öğrenme> 0.14) yerine belki daha ziyade el çocuğu yaratacak Pool().imap()
kullanmanın
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
Segmentasyon hatası düzeltildi mi? Genellikle segfault'lar _undefined_ davranışı olan ve bir segfault'a neden olmak için guarenteed olmayan geçersiz bellek erişiminden kaynaklanır. –
Cevap yok, ama ben bu işlib.Parallel sonsuza kadar asmak gibi görünüyor. Anlayabildiğim kadarıyla, segfault'u döndürmenin veya çok işlemcili bir "watchdog" zaman aşımı eklemenin bir yolu yoktur. –
Aslında, bir zaman aşımı dekoratör ekleyebilirsiniz? Burada gösterildiği gibi: http://code.activestate.com/recipes/577028/ –