多处理管理器字典没有更新

利霍何塞

我试图通过传递 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() 对象而不是正常的列表对象,这些对象在这种情况下应该按照您期望的方式执行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

多处理列表管理器

Python多处理和管理器

如何在类中嵌套多处理管理器字典

Python 多处理管理器字典,从进程和主进程访问

多处理/过程-如何管理队列/管理器?

具有进程池和自定义管理器的Python多处理事件

Python:在进程池中使用多处理管理器

上下文管理器和多处理池

如何在类中使用多处理管理器

多处理管理器和定制类

在 Python 中使用多处理的简单进程管理器

更改 Python 多处理管理器的衍生进程名称

代理设置对更新管理器没有帮助

Python多处理如何在不使用.join()方法的情况下更新管理器列表中的复杂对象

警报管理器没有取消

是否有xfce的更新管理器没有gnome依赖项?

多处理管理器不适用于 Jupyter Notebook 中的 spawn 或 forkserver 启动方法

多处理管理器在使用 pool.apply_async 的非常简单的示例中失败

在多处理功能中使用管理器(用于池)(Windows 10)

Python 3.6+:嵌套的多处理管理器导致FileNotFoundError

一个多处理管理器中的多个队列

在单行下重新组合多处理任务(Windows 10 任务管理器)

python多处理管理器连接创建另一个对象

使用更新管理器进行升级时,“没有可用的公共密钥”

Ubuntu更新后没有窗口管理器(例如,从13.10到14.04)

更新管理器失败,并显示“ ImportError:没有名为'ros_buildfarm'的模块”

更新管理器不显示所有更新

BLFS 有没有包管理器?

没有窗口管理器的Ubuntu 95%的时间