gpt4 book ai didi

python-3.x - python multiprocessing manager.list inside manager.dict

转载 作者:行者123 更新时间:2023-12-05 04:04:48 26 4
gpt4 key购买 nike

以下python代码:

from multiprocessing import Manager

manager = Manager()
globals = manager.dict()
globals["queue"] = manager.Queue()

#following line fails
globals["queue"].put("Starting")

因错误而失败:

  File "<string>", line 2, in __getitem__
File "/usr/lib/python3.5/multiprocessing/managers.py", line 732, in _callmethod
raise convert_to_error(kind, result)
multiprocessing.managers.RemoteError:
---------------------------------------------------------------------------
Unserializable message: ('#RETURN', <queue.Queue object at 0x7feb68a68ef0>)
---------------------------------------------------------------------------

谁能解释一下为什么?

最佳答案

简而言之,您通过尝试存储不可序列化的队列(它本身是线程安全的)来滥用线程安全字典。最好的方法是使用自变量来存储使用 manager 创建的集合:

d = manager.dict()
q = manager.Queue()

然后 q.put("Starting") 起作用了。您需要将其直接传递给将在单独进程中执行的函数或方法,例如:

def f(d,q):
d['a'] = 1
q.put('a')

p = Process(target=f, args=(d,q,))

multiprocessing.manager 应该用作线程和进程可以重用的线程安全集合的提供者。需要注意的是,源自 manager 的对象不能包含使用它创建的其他对象。

我推荐阅读 documentation of multiprocessing module这是非常友好的,并且有很多很好的例子可以作为开始。

关于python-3.x - python multiprocessing manager.list inside manager.dict,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52014663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com