Python multiprocessing.Pool 核心函数与使用流程详解

青禾
青禾
发布时间:2026-10-11| 1人浏览过
原创

本文总结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 时,请务必注意以下几点:

  1. 执行顺序:join() 必须放在 close() 或 terminate() 之后。如果先调用 join,主进程可能会无限期等待,或者因为进程池未关闭而允许继续提交任务,导致逻辑混乱。
  2. 参数传递:apply_async 的第一个参数是函数名,第二个参数是元组形式的参数列表 (args,),第三个可选参数是字典形式的关键词参数 kwds。
  3. 资源释放:确保在程序结束前调用 close() 和 join(),以便正确清理子进程资源,避免僵尸进程。

以上就是Python Pool常用函数用法总结的详细内容,更多关于Python多进程编程的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。