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!

原文地址:https://www.cnblogs.com/wangjunjiehome/p/15657302.html