簡體   English   中英

如何限制並發工人的數量?

[英]How to limit the number of concurrent workers?

我有一個函數,希望並行執行幾次,但同時只能定義一定數量的實例。

做到這一點的自然方法似乎是使用multiprocessing.Pool 具體來說,文檔說

一種常見的模式(...)是允許池中的工人在退出,清理和產生新流程來替換舊流程之前僅完成一定數量的工作。 池的maxtasksperchild參數向最終用戶公開了此功能。

maxtasksperchild定義為:

maxtasksperchild是工作進程退出之前可以完成的任務數,可以用新的工作進程替換以釋放未使用的資源。 默認的maxtasksperchild為None,這意味着工作進程將與池一樣長。

我不清楚任務在這里意味着什么。 例如,如果我只希望最多4個並行運行的worker實例,則可以啟動multiprocessing.Pool

pool = multiprocessing.Pool(processes=4, maxtasksperchild=4)

processesmaxtasksperchild如何maxtasksperchild工作? 我可以將processes設置為10,但仍然只有4個工作進程正在運行嗎(實際上有6個進程處於空閑狀態?)

正如醫生所說(也在您的描述中),

進程是可以並行運行的並行工作程序數,如果未設置,它將與您計算機中的CPU數相同。

maxtasksperchild是每個進程可以處理的最大任務數, 這意味着如果完成的任務數量達到maxtasksperchild,則該進程將被殺死,並且將啟動一個新進程並將其添加到Pool

讓我檢查一下代碼:

def f(x):
    print "pid: ", os.getpid(), " deal with ", x
    sys.stdout.flush()

if __name__ == '__main__':
    pool = Pool(processes=4, maxtasksperchild=2)
    keys = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    result = pool.map(f, keys)

這里我們使用4個進程,每個進程執行2個任務后將被殺死。 執行代碼后,您可以看到:

pid:  10899  deal with  1
pid:  10900  deal with  2
pid:  10901  deal with  3
pid:  10899  deal with  5
pid:  10900  deal with  6
pid:  10901  deal with  7
pid:  10902  deal with  4
pid:  10902  deal with  8
pid:  10907  deal with  9
pid:  10907  deal with  10

進程[10899-10902]中的每個進程執行2個任務后將被殺死,並且將使用新進程10907執行最后一個。

相比之下,如果我們使用更大的maxtasksperchild或默認值(這意味着進程將永遠不會被殺死,並且只要Pool就可以存活),如下所示:

if __name__ == '__main__':
    pool = Pool(processes=4, maxtasksperchild=10)
    keys = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    result = pool.map(f, keys)

結果:

pid:  13352  deal with  1
pid:  13353  deal with  2
pid:  13352  deal with  4
pid:  13354  deal with  3
pid:  13353  deal with  6
pid:  13352  deal with  7
pid:  13355  deal with  5
pid:  13354  deal with  8
pid:  13353  deal with  9
pid:  13355  deal with  10

如您所見,沒有創建任何新流程,並且所有任務都由原始4個流程完成。

希望這個有用〜

暫無
暫無

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

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