更新時(shí)間:2023-03-06 來(lái)源:黑馬程序員 瀏覽量:
當(dāng)我們遇到創(chuàng)建的子進(jìn)程不多的時(shí)候,通常就可以直接使用Process類(lèi)來(lái)進(jìn)行創(chuàng)建,然而若是需要成百上千個(gè)的時(shí)候,那么手動(dòng)去創(chuàng)建同時(shí)管理大量的子進(jìn)程無(wú)疑就顯得十分的煩瑣了,而且進(jìn)程的創(chuàng)建與銷(xiāo)毀的代碼也很大,此時(shí)我們可以使用進(jìn)程池。
Pool類(lèi)可以提供指定數(shù)量的進(jìn)程供用戶(hù)調(diào)用,當(dāng)提交新的請(qǐng)求到Pool中時(shí),如果進(jìn)程池還沒(méi)有滿(mǎn),那么就會(huì)創(chuàng)建一個(gè)新的進(jìn)程來(lái)執(zhí)行請(qǐng)求。當(dāng)進(jìn)程池滿(mǎn)了的時(shí)候,則請(qǐng)求就會(huì)先行等待,直到進(jìn)程池中有進(jìn)程結(jié)束,才會(huì)創(chuàng)建新的進(jìn)程來(lái)執(zhí)行這些請(qǐng)求。
下面是一個(gè)使用 Python 進(jìn)程池的簡(jiǎn)單示例,其中使用 multiprocessing 模塊來(lái)創(chuàng)建進(jìn)程池:
import multiprocessing def process_task(num): print(f"Processing task {num} in process {multiprocessing.current_process().name}") if __name__ == '__main__': # 創(chuàng)建進(jìn)程池,其中 processes 參數(shù)指定了池中的進(jìn)程數(shù)量 pool = multiprocessing.Pool(processes=4) # 提交任務(wù)到進(jìn)程池中,其中任務(wù)的參數(shù)是從 0 到 9 的整數(shù) results = [pool.apply_async(process_task, args=(i,)) for i in range(10)] # 等待所有任務(wù)完成 pool.close() pool.join() # 獲取任務(wù)的結(jié)果 for result in results: print(result.get())
在這個(gè)例子中,我們創(chuàng)建了一個(gè)進(jìn)程池,其中包含 4 個(gè)進(jìn)程。然后,我們使用 pool.apply_async() 方法將 10 個(gè)任務(wù)提交到進(jìn)程池中進(jìn)行處理。每個(gè)任務(wù)是 process_task() 函數(shù)的調(diào)用,函數(shù)接受一個(gè)整數(shù)參數(shù)并打印出這個(gè)參數(shù)的值以及當(dāng)前執(zhí)行任務(wù)的進(jìn)程的名稱(chēng)。在提交所有任務(wù)之后,我們調(diào)用 pool.close() 方法來(lái)關(guān)閉進(jìn)程池,然后調(diào)用 pool.join() 方法來(lái)等待所有任務(wù)完成。最后,我們使用 result.get() 方法來(lái)獲取每個(gè)任務(wù)的結(jié)果并打印出來(lái)。