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

