Python使用multiprocessing.Manager().list()跨进程共享数据异常求助
问题原因
- 对共享列表做了重新赋值:如果在子进程中执行了
sector_list = [xxx]这类操作,会直接将原本的共享代理对象替换为进程本地的普通列表,后续修改自然无法同步到其他进程。 - 修改了嵌套的可变对象未触发同步:
multiprocessing.Manager的共享容器仅监听顶层元素的增删改操作,如果列表内存储了字典、子列表等可变对象,直接修改子对象的内容不会触发同步机制,其他进程就无法读到更新。
解决方法
- 所有修改操作必须调用共享列表的自带方法:只能通过
append()、extend()、pop()、sector_list[i] = xxx这类直接操作共享对象本身的方法修改数据,禁止对共享变量名重新赋值。 - 修改嵌套可变对象后手动触发同步:如果需要修改列表内的子可变对象,修改完成后要将其重新赋值到原索引位,触发同步:
# 错误写法:修改子字典不会触发同步 sector_list[0]["板块名称"] = "新板块" # 正确写法:修改后重新赋值触发同步 temp_item = sector_list[0] temp_item["板块名称"] = "新板块" sector_list[0] = temp_item
可用参考示例
from multiprocessing import Process, Manager import time def test2(sector_list): # 模拟持续更新板块数据 count = 0 while True: # 调用共享列表的append方法,自动触发同步 sector_list.append(f"板块_{count}") count += 1 time.sleep(1) def test1(sector_list): while True: # 直接读取共享列表即可拿到最新数据 print(f"test1读到的板块列表: {list(sector_list)}") time.sleep(2) if __name__ == "__main__": manager = Manager() sector_list = manager.list() p1 = Process(target=test1, args=(sector_list,)) p2 = Process(target=test2, args=(sector_list,)) p1.start() p2.start() p1.join() p2.join()
额外注意事项
量化交易场景下数据更新频率较高,共享列表的读写自带进程锁,若存在高频并发读写可以额外搭配multiprocessing.Lock做更细粒度的并发控制,避免出现脏数据。
内容的提问来源于stack exchange,提问作者xibuzuoluo
相关产品推荐
相关产品推荐

