Process.join() ve kuyruk çok sayıda
N = 1000000
for i in xrange(N):
#do something
için bölmek çalışıyorum
çalışmaz ve N. küçük değerleri için iyi çalışır Sorun ne zaman ortaya Daha büyük N değerlerini kullanıyorum. P.join() 'den önce veya sırasında garip bir şeyler oluyor ve program cevap vermiyor. Eğer baskıyı koyarsam, fonksiyonun tanımında q.put (i) yerine her şey iyi çalışır.
Herhangi bir yardım için minnettarım. İşte kod.
from multiprocessing import Process, Queue
def f(q,nMin, nMax): # function for multiprocessing
for i in xrange(nMin,nMax):
q.put(i)
if __name__ == '__main__':
nEntries = 1000000
nCpu = 10
nEventsPerCpu = nEntries/nCpu
processes = []
q = Queue()
for i in xrange(nCpu):
processes.append(Process(target=f, args=(q,i*nEventsPerCpu,(i+1)*nEventsPerCpu)))
for p in processes:
p.start()
for p in processes:
p.join()
print q.qsize()
teşekkür ederiz! İşe yarıyor. – Puibo
Scriptimi yaklaşık 30 CPU'lu makineye gönderiyorum, bu yüzden 10 işlemle hala maksimum uzak değilim. İşlem sayısını azaltmam için başka nedenler var mı? Bazı veri analizi yapıyorum (yaklaşık 9M olay olan 50 gb veri). Fikrim, verileri parçalara ayırmaktı (örneğin, 10) ve çoklu işlemeyi kullanmaktı. Herhangi bir tavsiyeniz varsa bunu takdir ediyorum. – Puibo
Daha fazla işlem, işlemci sayısı kadar iyidir - süreçler bazen duraksa, CPU sayısını geçmesine rağmen. İntihal sorununun yolu, belki de bir programlama ödevi problemi olduğunu düşündüm - güçlü bir makinen olduğunu farketmedin :) Neyse, bir metrik düşünmek ne kadar hızlı bir şekilde tek bir şey yapıyorsun? - 10 işlemle 10X hız kazanıyorsanız (olası), bu harika! Süreçler arasındaki bağımlılıkları (bekleyişleri) azaltmak anahtardır - gördüğünüz gibi, kuyruğu boşaltmanız gerekir. –