【发布时间】:2020-02-19 00:54:56
【问题描述】:
我有一个班级B,它由另一个班级A组成。
在B 类中,我正在使用多处理池从A 类中调用一个方法。此方法更新A 的成员变量(这是一个字典)。
当我打印出这个成员变量时,它似乎没有被更新。这是描述问题的代码:
import multiprocessing as mp
class A():
def __init__(self):
self.aDict = {'key': 0}
def set_lock(self, lock):
self.lock = lock
def do_work(self, item):
print("Doing work for item: {}".format(item) )
self.aDict['key'] += 1
return [1,2,3] # return some list
class B():
def __init__(self):
self.objA = A()
def run_with_mp(self):
items=['item1', 'item2']
with mp.Pool(processes=mp.cpu_count()) as pool:
result = pool.map_async(self.objA.do_work, items)
result.wait()
pool.terminate()
print(self.objA.aDict)
def run(self):
items=['item1', 'item2']
for item in items:
self.objA.do_work(item)
print(self.objA.aDict)
if __name__ == "__main__":
b = B()
b.run_with_mp() # prints {'key': 0}
b.run() # prints {'key': 2}
b.run_with_mp() 打印 {'key': 0} 整个 b.run() 打印 {'key': 2}。我认为多处理池版本也会这样做,因为对象self.objA 具有运行多处理池的B 的完整类的范围。
我认为池中的每个工作人员看到的 self.objA 版本不同,这与主程序流程中的不同。有没有办法让所有工作人员更新一个公共变量?
【问题讨论】:
标签: python python-3.x python-multiprocessing