2013-10-29 12 views
0

我有以下的多碼我的多個過程可以更好的管理,使他們在完成(幾乎)在同一時間?

from multiprocessing import Pool 
pool = Pool(maxtasksperchild=20) 
likelihoods = pool.map_async(do_comparison, itertools.combinations(clusters, 2)).get() 
condensed_score_matrix = [1/float(l) if l != 0 and l < 5 else 10 for l in likelihoods] 
spectra_names = [c.get_names()[0] for c in clusters] 
pool.close() 

這段代碼的問題是不同的過程不會在同一時間完成。我正在使用八個進程。有可能是第一個進程完成和最後工序精加工20-30 +分鐘,最後的過程中單獨對當時的重要組成部分運行。如果將工作負載重新分配到已完成的進程,則會更快,因此所有內核都可以使用整個時間。

有沒有辦法做到這一點?

回答

1

方式工作量被劃分可以與map_async的chunksize參數來控制。

到您當前使用的默認行爲是大致chunksize = num_tasks/(num_processes * 4),因此平均每個進程將只能收到4塊忽略它。

您可以通過塊大小設置爲1,以驗證它正確分配負載,然後逐漸增加,直到你停止看到的性能改進啓動。

0

您可以嘗試使用不同的chunksize值與.imap_unordered進行試驗。 更多here

相關問題