Python跨进程数据共享:Manager vs Shared Memory
比较multiprocessing中Manager和共享内存(Value/Array/shared_memory.SharedMemory)两种跨进程数据共享方式的异同。Manager如何在进程之间同步数据?共享内存的优势和限制是什么?Python 3.8+的shared_memory模块解决了什么问题?给出性能对比。
回答
屠龙少年
Manager:通过代理进程(server process)管理共享对象。
from multiprocessing import Manager
with Manager() as manager:
d = manager.dict() # 代理dict
arr = manager.list()
# 所有子进程通过代理访问,自动同步
机制:Manager启动一个额外的管理进程,所有操作通过IPC序列化传输。 优势:简单、支持任意嵌套数据结构、自动同步 劣势:性能差(每次操作序列化+IPC),对于频繁小操作开销巨大
共享内存:
from multiprocessing import shared_memory
shm = shared_memory.SharedMemory('name', create=True, size=1024)
buf = shm.buf # memoryview
# 子进程通过相同name attach
优势:极高性能(直接内存访问,零拷贝),适合大数组 限制:只支持原始字节,需自行管理同步(用Lock),不支持动态大小
性能对比(100万次整数递增): | 方式 | 耗时 | |------|------| | Manager.dict | ~45s | | Value+Lock | ~3s | | shared_memory | ~0.5s |
适用场景:
- Manager:低频操作、复杂数据结构、便利性优先
- 共享内存:高频操作、大数组、性能敏感(NumPy数组跨进程共享)