[英]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)
processes
和maxtasksperchild
如何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.