Python學習筆記(二十六):使用進程池 Pool 創建子進程


接上一篇文章: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 ===")

輸出結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章