如何在进程内初始化multiprocessing.Array并在其他进程共享使用
进程内初始化multiprocessing.Array并实现跨进程共享
首先明确核心问题:Python多进程拥有独立内存空间,进程内直接重新赋值全局变量会创建本地新对象,和原共享Array无关,导致其他进程无法感知到这个新Array。要解决这个问题,需要用共享容器托管Array的引用,让所有进程都通过这个容器访问最新的Array。
问题原因分析
你修改后的代码中,a = Array('i', [a[0]])这行是在当前进程的本地内存中创建了新的Array对象,覆盖了全局变量a的本地引用,但这个新对象并没有被其他进程共享——其他进程的a仍指向最初的共享Array。所以两个进程各自修改自己本地的新Array,最终输出0 0 1 1。
解决方案:用Manager创建共享容器
使用multiprocessing.Manager可以创建跨进程共享的字典、命名空间等容器,用来存储Array的引用。所有进程通过这个共享容器获取最新的Array对象,就能实现动态更新后的共享。
示例代码
from multiprocessing import Array, Manager, Process import time def f(t, shared_dict): # 从共享字典中获取当前的Array a = shared_dict['arr'] print(a[0]) time.sleep(t) # 创建新的Array并更新到共享字典中 new_a = Array('i', [a[0]]) new_a[0] += 1 shared_dict['arr'] = new_a print(new_a[0]) if __name__ == '__main__': manager = Manager() # 初始化共享字典,存入初始Array shared_dict = manager.dict() shared_dict['arr'] = Array('i', [0]) p1 = Process(target=f, args=(1, shared_dict)) p2 = Process(target=f, args=(2, shared_dict)) p1.start() p2.start() p1.join() p2.join()
代码说明
Manager()创建的字典是跨进程共享的,所有进程对它的修改都会被其他进程感知。- 进程不再直接操作全局变量,而是通过
shared_dict['arr']获取当前的共享Array。 - 当进程创建新Array后,将其重新存入共享字典,其他进程后续访问时就能拿到这个新的Array。
额外注意事项
- 如果需要避免多个进程同时修改共享容器引发竞态条件,可以搭配
Lock使用,保证操作的原子性。 - 不要直接在进程内重新赋值全局变量来替换共享对象,必须通过共享容器传递引用。
内容的提问来源于stack exchange,提问作者urboom
相关产品推荐
相关产品推荐

