以下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>)
---------------------------------------------------------------------------
谁能解释为什么?
答案 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,它非常友好,并且有很多很好的例子。