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

Python官方multiprocessing.sharedctypes示例共享变量未同步原因咨询

问题成因

这个问题通常由两类原因导致:

1. 运行环境不兼容

  • 如果你是在Jupyter Notebook、IPython交互式解释器中运行代码,这类环境的模块导入机制和标准Python脚本不同,子进程启动时无法正确加载你在当前环境中定义的Point类和modify函数,会静默执行失败,不会抛出明显报错,因此共享内存的修改没有生效。
  • 如果你是在Windows系统下运行,multiprocessing默认使用spawn模式创建子进程,该模式要求所有传递给子进程的对象、函数、类必须定义在脚本的顶层作用域,且整个脚本可以被正常导入。如果你的代码存在缩进错误、自定义类放在if __name__ == '__main__'块内部等问题,子进程反序列化共享对象时会失败,导致修改逻辑没有执行。

2. 代码存在潜在逻辑问题

  • 遍历共享Array存储的自定义Structure对象时,直接用for a in A取出的a是共享内存元素的本地拷贝,修改a.x、a.y不会同步回共享内存,自然不会在主进程看到修改结果。
  • 部分Python版本中,手动传入自定义Lock对象给Value/Array时,跨进程传递锁可能出现序列化异常,导致共享对象的访问被阻塞,修改无法写入共享内存。
修复方案
  1. 不要在交互式环境、Jupyter中运行这段代码,新建独立的.py后缀脚本文件运行。
  2. 确保Point类、modify函数都定义在脚本顶层,不要放在任何代码块内部。
  3. 修改modify函数中遍历Array的逻辑,改为索引访问直接修改共享内存中的元素:
def modify(n, x, s, A):
    n.value **= 2
    x.value **= 2
    s.value = s.value.upper()
    for i in range(len(A)):
        A[i].x **= 2
        A[i].y **= 2
  1. 如果仍存在问题,移除创建Value/Array时手动传入的自定义锁,使用默认内置锁即可:
n = Value('i', 7)
x = Value(c_double, 1.0/3.0, lock=False)
s = Array('c', b'hello world')
A = Array(Point, [(1.875,-6.25), (-5.75,2.0), (2.375,9.5)])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:45:02