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
相关产品推荐
相关产品推荐

