在manager.dict中的python multiprocessing manager.list

时间:2018-08-25 06:35:43

标签: python-3.x

以下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>)
---------------------------------------------------------------------------

谁能解释为什么?

1 个答案:

答案 0 :(得分:1)

简而言之,您通过尝试存储不可序列化的队列(本身是线程安全的)来滥用线程安全指令。最好的方法是使用自变量存储用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,它非常友好,并且有很多很好的例子。