所以我试图在一个字典上使用多处理管理器,这是我最初的尝试:
from multiprocessing import Process, Manager
def task(stat):
test['z'] += 1
test['y']['Y0'] += 5
if __name__ == '__main__':
test = Manager().dict({'x': {'X0': 10, 'X1': 20}, 'y': {'Y0': 0, 'Y1': 0}, 'z': 0})
p = Process(target=task, args=(test,))
p.start()
p.join()
print(test)
当然,当我运行它时,输出不是我所期望的,z正确更新而y不变!这是输出:
{'x': {'X0': 10, 'X1': 20}, 'y': {'Y0': 0, 'Y1': 0}, 'z': 1}
然后我用谷歌搜索,在这里找到了一个解释,显然嵌套的字典也必须是Manager().dict()s 而不是普通的 python 字典(可能从 Python 3.6 开始)。所以我做了以下事情:
from multiprocessing import Process, Manager
def task(stat):
test['z'] += 1
test['y']['Y0'] += 5
if __name__ == '__main__':
test = Manager().dict({'x': Manager().dict({'X0': 10, 'X1': 20}), 'y': Manager().dict({'Y0': 0, 'Y1': 0}), 'z': 0})
p = Process(target=task, args=(test,))
p.start()
p.join()
print(test)
print(test['y'])
但是,我得到了这个无法解释的错误,而不是它正常工作,为了清楚起见,它分为三个部分。第一部分对应于,test['y']['Y0'] += 5而第二部分是简单的print(test),最后是输出print(test['y'])
我不确定为什么会这样。内部 dicts 显然是被创建的(如输出的第二部分所示)。但是由于某种原因,它们根本无法读取或写入!为什么会这样?
额外:如果我通过 python 控制台(而不是脚本)运行相同的 python 代码,错误会FileNotFoundError
从ConnectionRefusedError
. 但是具有相同的确切回溯!
FFIVE
相关分类