正如doc說(也是在你的說明),
過程是並行工作的人數可能一起運行,如果未設置,則它將與計算機中的CPU編號相同。
maxtasksperchild是最大數量的任務,每個進程可以處理,的,這意味着如果任務數完成達到maxtasksperchild,這一進程將被殺死,一個新的進程將開始加入到池
設我檢查代碼:
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或默認值(這意味着進程將永遠不會被殺死,是活着的,只要池),如下面的代碼:
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個進程完成。
願望這個有用〜
當你做一個'p.map(F,S)''那裏是p'一個'Pool',s'算作一個任務序列'的每個元素。 'p.apply(f)'被視爲一項任務。 –
你得到了'maxtasksperchild'的全部錯誤。但是,*爲什麼*要保留6個空閒進程?這比創建只有4個實際工作的流程更好嗎? – shx2
@DanD。謝謝 - 一旦另一項任務完成,任務會被任何進程使用(我的情況是4)? (他們正在排隊處理?) – WoJ