wil*_*007 9 python multiprocessing python-2.7
我希望下面的代码可以打印出来[{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)
Run Code Online (Sandbox Code Playgroud)
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])
Run Code Online (Sandbox Code Playgroud)
来自文档
注意对dict和列表代理中的可变值或项的修改不会通过管理器传播,因为代理无法知道何时修改其值或项.要修改此类项,可以将修改后的对象重新分配给容器代理:
看到你已经拥有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])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1735 次 |
| 最近记录: |