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

Python多进程共享变量报错:'Synchronized'对象不可迭代,求解决方案

多进程共享变量问题解决

错误原因及修复

1. 元组参数格式错误

创建multiprocessing.Process时,args参数要求传入元组。你写的args=(data)并非元组,Python会将括号内的Synchronized对象(即Value实例)当作可迭代对象尝试拆包,从而触发TypeError: 'Synchronized' object is not iterable。

修复方法:给单元素参数加逗号,明确为元组:

p = multiprocessing.Process(target=f, args=(data,))
j = multiprocessing.Process(target=f2, args=(data,))

2. 共享变量访问方式错误

multiprocessing.Value创建的共享变量,必须通过.value属性访问和修改。你代码里的num = num +1只是给函数内的局部变量赋值,根本没改动共享内存里的数值。

修复后的函数示例:

def f(num):
    while True:
        time.sleep(1.5)
        num.value += 1  # 通过.value修改共享变量
        print(f"process 1: {num.value}\n")
        if num.value > 50:
            break

def f2(num):
    while True:
        num.value += 1
        print(f"process 2: {num.value}\n")
        time.sleep(1.9)
        if num.value > 50:
            break

关于Queue的适用性

如果你的场景是一个循环进程持续生成结果,另一个进程偶尔获取最新结果:

  • 用Queue是可行的,但需要处理队列中旧数据的问题——比如每次获取前清空队列,只取最新的一条。
  • 但如果只是共享数值或矩阵这类状态变量,用multiprocessing.Value(单值)、Array(一维数组),或者multiprocessing.Manager提供的共享列表/字典(更灵活的复杂结构)会更直接,无需额外处理队列的清空逻辑。

完整修正代码

import multiprocessing
import os
import time

def info(title):
    print(title)
    print('module name:', __name__)
    print('parent process:', os.getppid())
    print('process id:', os.getpid())

def f(num):
    while True:
        time.sleep(1.5)
        num.value += 1
        print(f"process 1: {num.value}\n")
        if num.value > 50:
            break

def f2(num):
    while True:
        num.value += 1
        print(f"process 2: {num.value}\n")
        time.sleep(1.9)
        if num.value > 50:
            break

if __name__ == '__main__':
    data = multiprocessing.Value('i', 0)
    # 修正args为元组格式
    p = multiprocessing.Process(target=f, args=(data,))
    j = multiprocessing.Process(target=f2, args=(data,))
    p.start()
    j.start()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:10:37