我有一個(gè)列表,我multi-process分塊,假設(shè)它是:
l = range(100)
讓我們假設(shè)我有10個(gè)CPU(如multiprocessing.cpu_count()
)。列表l
分為10個(gè)區(qū)塊,然后每個(gè)進(jìn)程通過foo
函數(shù)負(fù)責(zé)每個(gè)區(qū)塊:
#pseudocode
def foo(chunk):
pid = multiprocessing.current_process().pid
for elem in chunk:
pr_elem = process(elem)
write pr_elem in ('out' + str(pid)) file
from more_itertools import divide
p = multiprocessing.Pool(multiprocessing.cpu_count())
p.map(foo, divide(multiprocessing.cpu_count(), l))
分配的PID的順序是否總是相對于iterable的遞增順序?我可以依賴這個(gè)順序并組合來自out[pid]
文件的結(jié)果,并且順序?qū)⑵ヅ淞斜碇械膲K(以及元素)嗎?
絕對不是。我有8個(gè)邏輯核,4個(gè)物理核。在下面的代碼中,我創(chuàng)建了一個(gè)大小為4的池,并調(diào)用
map
函數(shù),將chunksize指定為1,以便輔助函數(shù)一次只捕獲一個(gè)提交的任務(wù)。我還將立即插入一個(gè)sleep
調(diào)用作為輔助函數(shù)中的第一條指令,以確保給定進(jìn)程不會(huì)處理所有提交的任務(wù)。通過這種方式,我希望池中的4個(gè)進(jìn)程中的每個(gè)進(jìn)程都處理一個(gè)提交的任務(wù),并且print語句將按照提交任務(wù)的順序出現(xiàn)。Prints: