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

Python多进程使用mp.Manager.list共享列表时数据未更新问题排查

问题分析与解决

核心问题

mp.Manager.list仅对顶层元素的修改做进程间同步,你初始化时传入的子列表是普通Python列表,不属于Manager托管的共享对象。子进程里执行self.grp[i].append(each)时,操作的是子进程本地复制的子列表副本,主进程完全看不到这个变化。而counter是Manager.Value类型的托管共享对象,所以修改能正常同步。

解决方法

方法一:将子列表也替换为Manager.list

把每个子列表都改成Manager托管的共享列表,这样子列表的修改会自动同步到所有进程:

# 修改__init__里的grp初始化代码
self.grp = self.manager.list([
    self.manager.list([1]),
    self.manager.list([2]),
    self.manager.list([3]),
    self.manager.list([4])
])

方法二:修改子列表后重新赋值回grp[i]

如果不想替换所有子列表,可以手动更新顶层元素触发同步。修改子列表后,将其重新赋值给grp[i],让Manager感知到变化:

def process(self, subset):
    for each in subset:
        for i in range(len(self.grp)):
            each_grp = self.grp[i].copy()  # 先获取当前共享的子列表副本
            if each in each_grp:
                self.counter.set(self.counter.value + 1)
                each_grp.append(each)
                self.grp[i] = each_grp  # 重新赋值触发同步
                print(self.counter.value)

关于锁的补充

锁不是解决本次列表不更新的核心问题,但如果多个进程同时修改同一个子列表,仍需加锁避免竞争条件(比如重复append导致元素丢失)。可以在类中初始化一个Manager托管的锁:

# 在__init__中添加
self.lock = self.manager.Lock()

然后在修改共享对象时加锁:

with self.lock:
    self.counter.set(self.counter.value + 1)
    self.grp[i].append(each)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:20:41