接上一篇文章:Python學習筆記(二十五):使用跨平臺的 Process 創建子進程
當需要創建的子進程數量不多時,可以直接利用 multiprocessing 模塊中的 Process 類動態生成多個進程;但如果是上百甚至上千個目標,手動的去創建進程的工作量巨大,此時就可以使用 multiprocessing 模塊提供的 Pool 類去完成;
初始化 Pool 對象時,可以指定一個最大進程數,當有新的請求提交到 Pool 中時,如果池還沒有滿,那麼就會創建一個新的進程來執行該請求;但如果池中的進程數已經達到了指定的最大值,那麼該請求就會等待,直到池中有進程結束,纔會創建新的進程來執行;
以下代碼用 Pool 方法創建子進程:
# 導入 multiprocessing 模塊中的 Pool 類
from multiprocessing import Pool
import os
import time
import random
# 聲明一個函數:作爲子進程執行的代碼
def worker(i):
print("任務 %d 開始執行,進程ID:%d" %(i, os.getpid()))
time.sleep(1)
print("任務 %d 執行完畢" %(i))
# 實例化一個進程池對象,最大進程數爲3,即進程池中最多存在3個子進程
pool = Pool(3)
for i in range(1, 6):
# 向進程池中添加任務,取出進程池中的子進程對象執行該任務;
# 如果添加的任務數量超過了進程池中進程個數,那麼會等待進程池中的進程
# 執行完之前的任務之後,再來執行當前新添加的任務;
# 參數1表示子進程執行的對象;
# 參數2表示傳入到子進程中的數據,以元祖的形式傳入;
pool.apply_async(worker, (i, ))
print("=== start ===")
pool.close() # 關閉進程池,關閉後不再接受新的請求
pool.join() # 等待進程池中所有子進程執行完畢,必須放在 close() 方法後面
print("=== end ===")
輸出結果:
pool.apply_async(func, args) 方法是使用非阻塞的方式調用 func,即進程池啓用子進程執行任務的時候,進程池中的多個子進程可以同時執行,並且主進程也可以同時執行;參數 args 是傳入進程中的數據,使用元組的形式傳入;
pool.apply(func, args) 方法是使用阻塞的方法調用 func,即進程池啓用子進程執行任務的時候,當前進程阻塞,直到該進程執行結束後,纔會繼續向下執行;不管是進程池中的其他進程,還是主進程,都要等待; 如下代碼所示:
# 導入 multiprocessing 模塊中的 Pool 類
from multiprocessing import Pool
import os
import time
import random
# 聲明一個函數:作爲子進程執行的代碼
def worker(i):
print("任務 %d 開始執行,進程ID:%d" %(i, os.getpid()))
time.sleep(1)
print("任務 %d 執行完畢" %(i))
# 實例化一個進程池對象,最大進程數爲3,即進程池中最多存在3個子進程
pool = Pool(3)
for i in range(1, 6):
# 以阻塞的方式啓動進程池中的進程
pool.apply(worker, (i, ))
print("=== start ===")
pool.close() # 關閉進程池,關閉後不再接受新的請求
pool.join() # 等待進程池中所有子進程執行完畢,必須放在 close() 方法後面
print("=== end ===")
輸出結果: