簡體   English   中英

Python中的多處理全功能

[英]multiprocessing full capacity in Python

我編寫了以下代碼,該代碼並行調用6次函數(compute_cluster)(此函數的每次運行獨立於其他運行,每次運行將結果寫入單獨的文件中),以下是我的代碼:

global L
for L in range(6,24):
       pool = Pool(6)
       pool.map(compute_cluster,range(1,3)) 
       pool.close()  

if __name__ == "__main__":
   main(sys.argv)            

盡管我在I7處理器計算機上運行此代碼,並且無論我將Pool設置為多少,它始終只能並行運行兩個進程,所以有關於如何並行運行6個進程的建議嗎? 這樣前三個進程使用L = 6並並行調用參數值為1:3的compute_cluster,同時其他三個進程使用相同的參數值運行相同的函數,但是這次的全局L值為7? 任何建議都受到高度贊賞

這里有些錯誤。 首先,關於為什么每次總是只有2個進程的原因-原因是因為range(1, 3)只返回2個值。 因此,在關閉池之前,您只給池2個任務。

第二個問題是您要依賴全局狀態。 在這種情況下,代碼可能會起作用 ,但是它會限制您的性能,因為這是阻止您使用所有內核的因素。 我將並行化L循環,而不是“內部”范圍循環。 類似於1的東西:

def wrapper(tup):
    l, r = tup
    # Even better would be to get rid of `L` and pass it to compute_cluster
    global L
    L = l
    compute_cluster(r)

for r in range(1, 3):
    p = Pool(6)
    p.map(wrapper, [(l, r) for l in range(6, 24)])
    p.close()

這適用於全局L,因為每個產生的進程都選擇自己的L副本-進程之間不會共享。

1個 未經測試的代碼


正如評論中指出的,我們甚至可以將Pool退出循環:

p = Pool(6)
p.map(wrapper, [(l, r) for l in range(6, 24) for r in range(1, 3)])
p.close()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM