当前位置: 首页 > news >正文

介绍一下 multiprocessing 的 Manager模块

在 Python 的 multiprocessing 模块中,Manager 是一个用于跨进程共享数据的工具。由于多进程之间内存空间相互独立(不同于多线程共享同一内存),普通的变量、列表、字典等无法直接在进程间共享,而 Manager 提供了一种便捷的方式来创建可在多个进程间安全共享的对象。

Manager 的核心作用

Manager 通过创建一个服务器进程(manager process)来管理共享对象,其他进程通过网络连接(本地进程间通信)访问这个服务器进程中的对象。所有进程对共享对象的操作都会通过服务器进程中转,从而保证了数据的一致性和安全性。

支持的共享对象类型

Manager 支持创建多种常用的数据结构和同步原语,包括但不限于:
  • 基础数据结构:listdictNamespace(类似对象的属性访问)、Value(单个值)、Array(数组)等。
  • 同步工具:Lock(锁)、RLock(可重入锁)、Semaphore(信号量)、Event(事件)等。
  • 其他:Queue(队列)、JoinableQueue(可等待的队列)等。

使用方法

使用 Manager 的基本步骤如下:
  1. 创建 Manager 实例(multiprocessing.Manager())。
  2. 通过 Manager 实例创建需要共享的对象(如 manager.list()manager.dict())。
  3. 在子进程中使用这些共享对象(通过函数参数传递)。
  4. 结束后,通常需要手动关闭 Manager(可选,进程退出时会自动关闭)。

示例代码

下面是一个简单示例,展示多个进程通过 Manager 共享一个列表,并对其进行修改:
from multiprocessing import Process, Manager
import timedef add_item(shared_list, item):"""向共享列表中添加元素"""time.sleep(0.1)  # 模拟耗时操作shared_list.append(item)print(f"进程 {item} 添加完成,当前列表:{shared_list}")if __name__ == "__main__":# 创建 Manager 实例with Manager() as manager:# 创建共享列表shared_list = manager.list()# 创建 3 个子进程,分别向共享列表添加元素processes = []for i in range(3):p = Process(target=add_item, args=(shared_list, i))processes.append(p)p.start()# 等待所有子进程完成for p in processes:p.join()# 打印最终结果print(f"最终共享列表:{shared_list}")
输出(顺序可能因进程调度略有不同
进程 0 添加完成,当前列表:[0]
进程 1 添加完成,当前列表:[0, 1]
进程 2 添加完成,当前列表:[0, 1, 2]
最终共享列表:[0, 1, 2]

优缺点分析

  • 优点
    • 支持多种复杂数据结构(如 dictlist),使用方式与普通对象一致,易于理解。
    • 无需手动处理底层的进程同步细节(内部已实现基本同步)。
    • 可用于跨机器的进程共享(通过网络连接远程 Manager)。
  • 缺点
    • 由于依赖服务器进程中转,性能比基于共享内存的方式(如 multiprocessing.Valuemultiprocessing.Array)稍低,适合数据量不大或交互不频繁的场景。
    • 共享对象的操作需要通过网络通信,可能引入一定延迟。

注意事项

  1. 同步问题:虽然 Manager 内部实现了基本同步,但多进程同时修改复杂对象(如嵌套字典)时,仍可能出现数据不一致,需手动添加锁(如 manager.Lock())。
  2. 可序列化:通过 Manager 传递的对象需要支持序列化(pickle),否则可能报错。
  3. 资源释放:使用 with 语句管理 Manager 可自动释放资源,避免泄露。
总之,Manager 是多进程间共享数据的便捷工具,尤其适合需要共享复杂数据结构且对性能要求不极致的场景。
http://www.dtcms.com/a/554090.html

相关文章:

  • 网页建站总结报告网站建设初期怎么添加内容
  • C语言——猜数字游戏(rand、srand、time函数学习)
  • 多媒体网站开发实战装修设计软件免费
  • Rust流程控制(下):loop、while、for循环
  • 使用 UV 工具管理 Python 项目的常用命令
  • 解析视频汇聚平台EasyCVR强大的设备统一管理能力,助力构筑安防融合感知的基石
  • 南通做网站的手机怎么看网页源代码
  • 温州网上推广什么网站好深圳网络推广团队
  • 1951-2024年我国逐日\逐月\逐年近地面气温栅格数据
  • Linux----进程控制
  • 公司网站建设公司微网站建设价格
  • AI代码开发宝库系列:RAG--GraphRAG实战
  • 做一份网站动态图多少钱免费ip地址
  • 基于空间螺旋运动假设的水星近日点进动理论推导与验证
  • 手写Spring第20弹:JDK动态代理:深入剖析Java代理模式
  • 京网站建设公司行业app开发公司
  • 平面设计网站导航dw软件代码大全
  • PyTorch生成式人工智能——MUNIT详解与实现
  • 建设微网站网站公司介绍模板
  • 网站为什么做微云的采集备案网站首页地址
  • [linux] rm命令
  • HTML加密工具EXE软件介绍
  • 大模型微调怎么实现?当然不是人工对一些参数微小调整!
  • TRAE SOLO:基于React 18+与蓝耘MaaS的多语言智能翻译平台设计与实现
  • 做网站编辑需要会什么深圳网络推广平台
  • 深入解析 MybatisPlus 中实现一对多查询的方法:以食谱餐别与菜单详情为例
  • 网站为什么不被收录做c2c网站的弊端
  • SMB签名关闭的安全风险探讨
  • 邵阳网站网站建设wordpress文章添加seo标题代码
  • 网站怎样做才会被百度收录湖北网站