更新時間:2023-03-06 來源:黑馬程序員 瀏覽量:
當(dāng)我們遇到創(chuàng)建的子進(jìn)程不多的時候,通常就可以直接使用Process類來進(jìn)行創(chuàng)建,然而若是需要成百上千個的時候,那么手動去創(chuàng)建同時管理大量的子進(jìn)程無疑就顯得十分的煩瑣了,而且進(jìn)程的創(chuàng)建與銷毀的代碼也很大,此時我們可以使用進(jìn)程池。
Pool類可以提供指定數(shù)量的進(jìn)程供用戶調(diào)用,當(dāng)提交新的請求到Pool中時,如果進(jìn)程池還沒有滿,那么就會創(chuàng)建一個新的進(jìn)程來執(zhí)行請求。當(dāng)進(jìn)程池滿了的時候,則請求就會先行等待,直到進(jìn)程池中有進(jìn)程結(jié)束,才會創(chuàng)建新的進(jìn)程來執(zhí)行這些請求。
下面是一個使用 Python 進(jìn)程池的簡單示例,其中使用 multiprocessing 模塊來創(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())
在這個例子中,我們創(chuàng)建了一個進(jìn)程池,其中包含 4 個進(jìn)程。然后,我們使用 pool.apply_async() 方法將 10 個任務(wù)提交到進(jìn)程池中進(jìn)行處理。每個任務(wù)是 process_task() 函數(shù)的調(diào)用,函數(shù)接受一個整數(shù)參數(shù)并打印出這個參數(shù)的值以及當(dāng)前執(zhí)行任務(wù)的進(jìn)程的名稱。在提交所有任務(wù)之后,我們調(diào)用 pool.close() 方法來關(guān)閉進(jìn)程池,然后調(diào)用 pool.join() 方法來等待所有任務(wù)完成。最后,我們使用 result.get() 方法來獲取每個任務(wù)的結(jié)果并打印出來。