Python multiprocessing.Pool 核心函数与使用流程详解
本文总结Python中multiprocessing.Pool的核心函数用法,包括apply_async实现非阻塞并行调用、close关闭进程池以及join等待子进程结束。通过两个完整代码示例,演示如何配置进程数、传递参数及控制执行流程,帮助开发者高效利用多核资源。
Pool 核心函数解析
在 Python 的多进程编程中,Pool 类提供了管理进程池的高级接口。掌握其关键函数的行为是编写高效并发程序的基础。主要涉及以下三个核心操作:
- apply_async(func[,args[,kwds]]):用于非阻塞地调用目标函数
func。它允许主进程在提交任务后立即继续执行,而无需等待该任务完成。这是实现并行处理的关键。 - close():关闭进程池,表示不再接受新的任务提交。调用此方法后,进程池将进入“关闭”状态。
- terminate():立即终止进程池中所有正在执行和等待执行的子进程。与
close不同,它不等待任务完成,直接强制结束。 - join():使主进程阻塞,直到所有子进程退出。此方法必须在
close()或terminate()之后调用,否则可能引发异常或行为未定义。
理解这些函数的执行顺序至关重要:apply_async 负责提交任务,close 锁定提交权限,join 确保所有任务执行完毕。若使用 apply(阻塞式),则需等待当前任务完成后才能提交下一个,这会丧失并行的优势。
基础示例:异步任务提交与进程控制
以下代码展示了如何获取 CPU 核心数,创建进程池,并使用 apply_async 提交多个异步任务。代码通过 close() 和 join() 确保所有任务完成后主进程才退出。
#coding: utf-8
import multiprocessing
import time
def func(msg):
print("msg:", msg)
time.sleep(3)
print("end")
if __name__ == "__main__":
cores = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes=cores)
print("Adding tasks...")
for i in range(cores):
msg = "hello %d" %(i)
pool.apply_async(func, (msg, )) #维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去
print("Starting tasks...")
pool.close()
pool.join() #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束
print("Sub-process(es) done.")进阶示例:带参数与耗时统计的进程池
在实际应用中,我们常需传递更多参数并监控任务执行情况。下面的示例定义了一个最大进程数为 3 的进程池,循环提交 10 个任务。每个任务模拟随机耗时,并打印进程 ID 和执行时间,展示了 Pool 如何复用空闲子进程来执行新任务。
# -*- coding:utf-8 -*-
from multiprocessing import Pool
import os, time, random
def worker(msg):
t_start = time.time()
print("%s开始执行,进程号为%d" % (msg,os.getpid()))
# random.random()随机生成0~1之间的浮点数
time.sleep(random.random()*2)
t_stop = time.time()
print(msg,"执行完毕,耗时%0.2f" % (t_stop-t_start))
po = Pool(3) # 定义一个进程池,最大进程数3
for i in range(0,10):
# Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
# 每次循环将会用空闲出来的子进程去调用目标
po.apply_async(worker,(i,))
print("----start----")
po.close() # 关闭进程池,关闭后po不再接收新的请求
po.join() # 等待po中所有子进程执行完成,必须放在close语句之后
print("-----end-----")
关键注意事项
在使用 Pool 时,请务必注意以下几点:
- 执行顺序:
join()必须放在close()或terminate()之后。如果先调用join,主进程可能会无限期等待,或者因为进程池未关闭而允许继续提交任务,导致逻辑混乱。 - 参数传递:
apply_async的第一个参数是函数名,第二个参数是元组形式的参数列表(args,),第三个可选参数是字典形式的关键词参数kwds。 - 资源释放:确保在程序结束前调用
close()和join(),以便正确清理子进程资源,避免僵尸进程。
以上就是Python Pool常用函数用法总结的详细内容,更多关于Python多进程编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









