gpt4 book ai didi

python - 未反射(reflect)manager.dict中的值更新

转载 作者:行者123 更新时间:2023-12-04 03:57:53 24 4
gpt4 key购买 nike

我希望以下代码可以打印[{0: 100}]
因为它在updateList中执行了加号一百次
依次输出[{0: 0}]有什么问题以及如何解决?

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])

来自 docs

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

就像已经有了 dict1一样,您可以直接更新:
   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])

关于python - 未反射(reflect)manager.dict中的值更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26562287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com