當要進行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!