Multiprocessing Manager Dict 未更新

Multiprocessing Manager Dict is not getting updated

我试图通过传递 Manager.dict 来捕获每个进程的开始和结束时间。当我使用 fun 它没有按预期工作,但是 fun_1 它的工作。我 运行 这个代码在 python 3.7 (IDE VS Code)

import time
from multiprocessing import Manager
from multiprocessing.pool import Pool


def fun(a, d):
    if a not in d:
        d[a] = list()

    d[a].append(time.time())
    time.sleep(1)
    d[a].append(time.time())


def fun_1(a, d):

    s = time.time()
    time.sleep(1)
    e = time.time()
    d[a] = [s, e]


if __name__ == '__main__':
    pool = Pool(4)
    m = Manager()
    d = m.dict()
    pool.starmap(fun, [(i, d) for i in range(10)])
    print(d) # {3: [], 0: [], 2: [], 1: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: []}

看来我遗漏了什么。提前致谢

此线程解释了您的问题:https://bugs.python.org/issue36119

作为解决此问题的一种方法,您应该执行 __setitem__ 操作,允许系统注意到对象中的更改,该更改会传播到共享管理器对象。这就是为什么您的 fun_1 与您的表演 d[a] = [s,e] 一样有效。

另一种选择是您可以预定义 manager.list() 对象而不是普通的列表对象,在这种情况下它们应该按照您期望的方式执行。