news 2026/4/16 15:48:37

python 多进程apply_async、map_async、pool.imap的用法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python 多进程apply_async、map_async、pool.imap的用法

想要系统掌握 Python 多进程模块multiprocessing.Poolapply_asyncmap_asyncimap这三个核心方法的使用语法、核心差异、适用场景和实战示例,从而根据实际需求选择合适的多进程并发方式,提升程序执行效率。


前置基础

在讲解这三个方法前,先明确核心前提:

  1. multiprocessing.Pool(进程池)用于管理一组子进程,避免频繁创建 / 销毁进程的开销;
  2. 「同步」方法(如applymap)会阻塞主进程,直到子进程执行完成;「异步」方法(如apply_asyncmap_async)不会阻塞,可继续执行主进程代码;
  3. Windows 系统中,多进程代码必须放在if __name__ == "__main__":块中(避免递归创建子进程),Linux/macOS 无强制要求,但建议统一写法;
  4. 进程间数据隔离:子进程无法修改主进程的变量,结果需通过返回值获取。

一、apply_async:异步执行单个任务

1. 核心作用

异步提交单个任务到进程池,主进程不阻塞,可继续执行其他逻辑;支持传参、回调函数(任务完成后自动调用)。

2. 语法

python

pool.apply_async(func, args=(), kwds={}, callback=None, error_callback=None)
参数说明
func子进程要执行的函数
args传给func的位置参数(元组)
kwds传给func的关键字参数(字典)
callback可选,任务成功执行后调用的回调函数(参数为func的返回值)
error_callback可选,任务执行出错时调用的回调函数(参数为异常对象)

3. 实战示例

python

import multiprocessing import time # 子进程执行的函数 def task(num): time.sleep(1) # 模拟耗时操作 return f"任务{num}完成,进程ID:{multiprocessing.current_process().pid}" # 回调函数(任务成功后执行) def success_callback(result): print(f"回调函数:{result}") # 错误回调函数 def error_callback(e): print(f"任务出错:{str(e)}") if __name__ == "__main__": # 创建进程池(指定4个工作进程) pool = multiprocessing.Pool(processes=4) # 异步提交单个任务 result_obj1 = pool.apply_async(task, args=(1,), callback=success_callback) result_obj2 = pool.apply_async(task, args=(2,), callback=success_callback) # 提交一个会出错的任务(测试错误回调) result_obj3 = pool.apply_async(task, args=("错误参数",), error_callback=error_callback) # 主进程继续执行(不阻塞) print("主进程:所有任务已提交,等待子进程执行...") # 必须关闭进程池 + 等待所有子进程完成(否则主进程退出,子进程会被强制终止) pool.close() pool.join() # 也可通过result_obj.get()获取单个任务的返回值(会阻塞直到任务完成) # print(result_obj1.get())
输出(顺序可能因进程调度略有不同)

plaintext

主进程:所有任务已提交,等待子进程执行... 回调函数:任务1完成,进程ID:12345 回调函数:任务2完成,进程ID:12346 任务出错:invalid literal for int() with base 10: '错误参数'

4. 适用场景

  • 需要逐个提交任务,且每个任务参数 / 逻辑可能不同;
  • 需为单个任务设置成功 / 失败回调;
  • 任务数量少,或任务提交时机不固定(如动态生成任务)。

二、map_async:异步批量执行可迭代任务

1. 核心作用

异步提交一组可迭代任务(如列表、元组)到进程池,功能等价于map()的异步版本;所有任务的参数来自可迭代对象,结果按输入顺序返回,支持回调函数。

2. 语法

python

pool.map_async(func, iterable, chunksize=None, callback=None, error_callback=None)
参数说明
func子进程要执行的函数(仅接收单个参数,由iterable的元素传入)
iterable可迭代对象(如列表),每个元素作为func的参数
chunksize可选,分块大小(大数据集时设置可提升效率,默认自动分块)

3. 实战示例

python

import multiprocessing import time def task(num): time.sleep(1) return f"任务{num}完成,进程ID:{multiprocessing.current_process().pid}" def batch_callback(results): # 回调函数的参数是所有任务的结果列表(按输入顺序) print("批量回调:所有任务完成,结果如下:") for res in results: print(res) if __name__ == "__main__": pool = multiprocessing.Pool(processes=4) # 异步批量提交任务(iterable为列表[1,2,3,4]) result_obj = pool.map_async(task, [1,2,3,4], callback=batch_callback) print("主进程:批量任务已提交,等待执行...") pool.close() pool.join() # 也可通过result_obj.get()获取结果列表(按输入顺序) # print(result_obj.get())
输出

plaintext

主进程:批量任务已提交,等待执行... 批量回调:所有任务完成,结果如下: 任务1完成,进程ID:12345 任务2完成,进程ID:12346 任务3完成,进程ID:12347 任务4完成,进程ID:12348

4. 适用场景

  • 批量执行相同逻辑的任务,参数来自可迭代对象;
  • 需异步执行且关注结果顺序;
  • 任务数量适中,可一次性加载到内存。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 13:44:38

ResNet18+CIFAR10开箱即用:预装环境,5分钟出结果

ResNet18CIFAR10开箱即用:预装环境,5分钟出结果 引言:为什么选择这个方案? 作为一名教师,你是否遇到过这样的困扰:每次开设深度学习实践课,学生都要花大量时间配置环境、调试代码,…

作者头像 李华
网站建设 2026/4/16 9:07:02

如何设计一套通用的支付核心系统?

支付永远是一个公司的核心领域,因为这是一个有交易属性公司的命脉。那么,支付系统到底长什么样,又是怎么运行交互的呢? 抛开带有支付牌照的金融公司的支付架构,下述链路和系统组成基本上符合绝大多数支付场景。其实整体可以看成…

作者头像 李华
网站建设 2026/4/16 9:06:46

ResNet18物体识别:10元预算玩转深度学习

ResNet18物体识别:10元预算玩转深度学习 1. 为什么选择ResNet18? 作为一名自媒体作者,你可能经常需要拍摄商品测评视频。但手动剪辑和标注商品信息耗时耗力,这时候AI物体识别技术就能派上用场。ResNet18作为深度学习领域的"…

作者头像 李华
网站建设 2026/4/16 9:08:44

如何用Qwen2.5-7B-Instruct实现工具调用?vLLM镜像部署全解析

如何用Qwen2.5-7B-Instruct实现工具调用?vLLM镜像部署全解析 引言:大模型能力跃迁的关键一步——工具调用 随着大语言模型(LLM)在自然语言理解与生成方面的能力持续进化,单纯“回答问题”的模式已无法满足复杂应用场景…

作者头像 李华
网站建设 2026/4/16 11:02:43

Rembg抠图实战:人像照片去背景完整流程

Rembg抠图实战:人像照片去背景完整流程 1. 引言:智能万能抠图 - Rembg 在图像处理与内容创作领域,精准、高效地去除图片背景是一项高频且关键的需求。无论是电商产品精修、人像摄影后期,还是AI生成内容(AIGC&#xf…

作者头像 李华