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 ===")

输出结果:

 

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