Python多进程共享multiprocessing.Array是否采用共享内存IPC?
关于multiprocessing.Array跨进程共享的代码问题解答
咱们先从代码语法和核心机制两方面来拆解你的问题:
1. 你的代码存在语法错误
首先看你写的这段进程创建代码:
self.procs = [MP.Process(target=worker, kwargs=dict(sh_array=array) for _ in range(num_workers)]
这里少了一个闭合的括号——dict(sh_array=array)后面需要加个)来结束MP.Process的参数传递,正确写法应该是:
self.procs = [MP.Process(target=worker, kwargs=dict(sh_array=array)) for _ in range(num_workers)]
这个语法问题不修正的话,代码根本跑不起来。
2. 关于IPC机制的核心疑问:完全符合你的要求!
你担心的“消息传递/基于复制的IPC”问题,完全不用顾虑——multiprocessing.Array本身就是基于共享内存(或文件映射,取决于操作系统)实现的,完全是你想要的快速IPC方式:
- 父进程创建的
Array对象,本质是一块被多个进程映射到各自地址空间的物理内存; - 子进程拿到的
sh_array只是这块共享内存的引用,而不是数据副本; - 所有读写操作都是直接在共享内存上进行的,没有额外的数据复制或消息传递开销,完全符合你的设计初衷。
只要你传递的是multiprocessing.Array(而不是普通的Python list),就不会触发任何后台的复制或消息队列操作。
3. 修正后的完整可运行示例
给你写一个完整的示例,能直观看到共享内存的效果:
import multiprocessing as MP def worker(sh_array): # 子进程直接操作共享数组,没有复制开销 for i in range(len(sh_array)): sh_array[i] += 1 print(f"子进程修改后的片段: {list(sh_array)}") if __name__ == "__main__": num_workers = 3 # 创建共享数组:类型为int('i'是类型码),长度5,初始值全0 shared_array = MP.Array('i', [0] * 5) # 修正后的进程创建代码 procs = [MP.Process(target=worker, kwargs=dict(sh_array=shared_array)) for _ in range(num_workers)] # 启动并等待所有子进程完成 for proc in procs: proc.start() for proc in procs: proc.join() # 父进程查看最终结果(会看到所有子进程的修改累加) print(f"父进程最终看到的数组: {list(shared_array)}")
4. 额外的实用提示
- Windows系统注意事项:一定要把共享对象创建、进程启动的代码放在
if __name__ == "__main__":块里,否则会触发multiprocessing的重复初始化问题; - 竞态条件处理:共享内存本身是无锁的,如果多个进程同时读写同一个数组位置,会出现数据错乱。如果需要同步操作,搭配
multiprocessing.Lock即可:
创建进程时传递锁:def worker(sh_array, lock): with lock: # 加锁确保同一时间只有一个进程修改数组 for i in range(len(sh_array)): sh_array[i] += 1kwargs=dict(sh_array=shared_array, lock=MP.Lock()) - 复杂结构扩展:如果需要多维数组,可以用
numpy.frombuffer把multiprocessing.Array包装成numpy数组,操作更方便,同样是基于共享内存的。
内容的提问来源于stack exchange,提问作者Kiuhnm
相关产品推荐
相关产品推荐

