You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在进程内初始化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()

代码说明

  1. Manager()创建的字典是跨进程共享的,所有进程对它的修改都会被其他进程感知。
  2. 进程不再直接操作全局变量,而是通过shared_dict['arr']获取当前的共享Array。
  3. 当进程创建新Array后,将其重新存入共享字典,其他进程后续访问时就能拿到这个新的Array。

额外注意事项

  • 如果需要避免多个进程同时修改共享容器引发竞态条件,可以搭配Lock使用,保证操作的原子性。
  • 不要直接在进程内重新赋值全局变量来替换共享对象,必须通过共享容器传递引用。

内容的提问来源于stack exchange,提问作者urboom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 05:39:52