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

标签 python python-2.7 multiprocessing

我希望以下代码可以打印[{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/

相关文章:

python - 测试 niceness 是否被正确应用

python - 如何为多面 Altair 图表设置共享标题?

python - 如何合成声音?

python - 删除段落并将所有内容保存到一行

python - MySQL-python 安装程序找不到正确的 Python 版本

python - Words.txt 文件中有多少个单词的元音字母为 a e i o u 按顺序排列?

ruby - Ruby 中的网络爬虫 : How to achieve the best perfomance?

python - 大查询存储。 Python。并行读取多个流(多处理)

python - 如何在 tkinter ENTRY 中突出显示预先输入的文本,以便用户可以直接键入(无需选择、删除)

python - 显示 chrome 历史文件的 sql 数据库