Python多程序之Pool程序池淺析
當要進行CPU密集型任務,推薦使用python多程序;反之如果是IO密集型任務,推薦python多執行緒。
下面採用程序池pool講解程式碼寫法:
import multiprocessing
import time
import os
if __name__ == '__main__':
processing_pool()
def processing_pool():
# 在程序池中準備 2 個程序
pool = multiprocessing.Pool(2)
# 共有 4 個任務要執行
# 2 個程序要去執行 4 個任務,程序數是不夠的
# 程序池的機制為,當一個程序執行完任務後將重新回到程序池中備用
# 如果還有任務要執行,那麼就從程序池中拿出空閒的程序使用
for i in range(4):
pool.apply_async(run, args=(i, ))
# 先關閉程序池,意思為程序池不再接受新的任務
pool.close()
# 將程序加入到主程序中,防止子程序尚未結束,主程序已經執行完,導致殺死子程序。
# 如果沒有 pool.join(),那麼主程序在執行完 pool.close() 後其程式碼結束,所以主程序會關閉。
# 而加入 pool.join() 意味著子程序的程式碼也算在主程序程式碼內,子程序沒完,則主程序也沒完
# 此時主程序會等待子程序結束後再結束。
pool.join()
def run(i):
print(f"job_id:{i}")
# 當 n==3 時,當前程序任務執行完畢
for n in range(3):
time.sleep(0.5)
print(f"p_id:{i} n:{n+1}")
print(f"job_id:{i} ----- stop! ")
執行結果為:
job_id:0
job_id:1
p_id:0 n:1
p_id:1 n:1
p_id:0 n:2
p_id:1 n:2
p_id:0 n:3
job_id:0 ----- stop!
job_id:2
p_id:1 n:3
job_id:1 ----- stop!
job_id:3
p_id:2 n:1
p_id:3 n:1
p_id:2 n:2
p_id:3 n:2
p_id:2 n:3
job_id:2 ----- stop!
p_id:3 n:3
job_id:3 ----- stop!