2016-04-14 17 views
0

Bir süreyi 16 kez değerlendirmek için uzun süren bir işlev yapıyorum. Ancak, tüm bu çalışmalar birbirinden bağımsızdır. Bu yüzden Joblib kullanarak hızlandırmaya karar verdim.İş sonuçlarını joblib kullanarak döndürme

Joblib, olması gerektiği gibi çalışır ve hızlandırır, ancak bir sorunla uğraşıyorum - değerlendirilen değeri düzgün bir şekilde nasıl iade edebilirim? 16 sonucu hafızaya, ideal olarak bir listeye kaydetmek istiyorum. Ancak, global bir değişken kullanmak, yeni bir Python süreci ebeveynin yaptığı global değişkenleri kullanmadığı için bir seçenek gibi görünmemektedir. Joblib belgelerine göre, Parallel'in max_nbytes argümanı, paylaştırılacak dizi büyüklüğüne bir eşik koyar, ancak çocuk süreç işlevlerindeki 16 tamsayı listesine yaptığım tüm değişiklikler, ana işlemdeki listede hiçbir etki yaratmamıştır.

Hesaplanan değerleri dosyalara kaydedip, ardından ana işlemi kullanarak daha sonra geri almak için tek seçenek mi yoksa başka seçenek var mı?

cevap

1

Eğer gerçekten bir joblib'e ihtiyacınız varsa, sonuçlarınızı bir Queue'a koyabilir ve sonuçlarınızı en sonunda alabilirsiniz. from multiprocessing documentation:

from multiprocessing import Process, Queue 

def f(q): 
    q.put([42, None, 'hello']) 

if __name__ == '__main__': 
    q = Queue() 
    p = Process(target=f, args=(q,)) 
    p.start() 
    print q.get() # prints "[42, None, 'hello']" 
    p.join() 

Ayrıca tam olarak bu işlevi gören multiprocessing.Pool kullanabilirsiniz: [9 1, 4]

: (from multiprocessing documentation)

from multiprocessing import Pool 

def f(x): 
    return x*x 

if __name__ == '__main__': 
    p = Pool(5) 
    print(p.map(f, [1, 2, 3])) 

standart çıkışa yazdırır

+0

Kuyruk kusursuz çalışıyor, teşekkürler! – prkist

İlgili konular