未反映manager.dict中的值更新

编程入门 行业动态 更新时间:2024-10-24 18:18:51
本文介绍了未反映manager.dict中的值更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我希望以下代码可以打印[{0: 100}], 因为它会执行updateList中的加号一百次 反过来,它打印[{0: 0}] 有什么问题以及如何解决?

I expect the following code to print [{0: 100}], since it do the plus in updateList for a hundred time In turn, it prints [{0: 0}] what's the problem and how to rectify it?

from multiprocessing import Process, Lock, Value,Manager class myWorker: def __init__(self, lock, driver, i): self.idx=i self.driver=driver self.lock=lock def run(self): self.driver.updateList(self.lock,self.idx) class driver(object): def __init__(self): manager=Manager() self.lock=Lock() self.lst=manager.list() self.dict1=manager.dict({0:0}) self.lst.append(self.dict1) def workerrun(self,lock, i): worker1=myWorker(lock,self,i) worker1.run() def run(self): D=[Process(target=self.workerrun,args=(self.lock,i)) for i in range(10)] for d in D: d.start() for d in D: d.join() def updateList(self,l,i): with self.lock: # acquire lock for j in range(10): self.lst[0][0]+=1 print ("update from", i) if __name__=='__main__': dr=driver() dr.run() print(dr.lst)

推荐答案

def updateList(self,l,i): with self.lock: # acquire lock for j in range(10): d = self.lst[0] d[0] += 1 self.lst[0]=d print ("update from", i,self.lst[0])

来自文档

注意对dict和list代理中的可变值或项的修改将不会通过管理器传播,因为代理无法知道何时修改其值或项.要修改此类项目,您可以将修改后的对象重新分配给容器代理:

如果您已经拥有dict1,则可以直接进行更新:

Seeing as you already have dict1, you can update directly:

def updateList(self,l,i): with self.lock: # acquire lock for j in range(10): self.dict1[0]+=1 print ("update from", i,self.lst[0])

更多推荐

未反映manager.dict中的值更新

本文发布于:2023-11-10 06:30:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1574610.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:manager   dict

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!