我认为 multiprocessing.Pool
使用 pickle
通过 initargs
到子进程。
然而,我发现以下观点:
value = multiprocessing.Value('i', 1)
multiprocess.Pool(initializer=worker, initargs=(value, )) # Works
但这不起作用: pickle.dumps(value)
投掷:
RuntimeError: Synchronized objects should only be shared between processes through inheritance
为什么会这样,如何进行多重处理 initargs
可以绕过它,因为它也用泡菜?
据我所知, multiprocessing.Value
在后台使用共享内存时,继承和通过initargs传递有什么区别?具体来说,在windows上,代码不会分叉,因此 multiprocessing.Value
是创建的。
1条答案
按热度按时间i2byvkas1#
如果您传递了multiprocessing.lock()的示例,则错误消息将是runtimeerror:lock对象只能通过继承在进程之间共享。如果您正在创建
multiprocessing.Process
,这实际上是当您说initializer=worker,initargs=(value,)时使用的。正在进行的测试是当前是否正在生成一个进程,而当您已经有一个现有的进程池并且现在正在提交一些工作时,情况就不是这样了。但为什么会有这样的限制?您可以将共享内存pickle到一个文件中,然后在一周后尝试取消pickle并使用它,这有意义吗?当然不是!python无法知道您不会做这样愚蠢的事情,因此它对共享内存和锁的pickle/unpickle设置了很大的限制,这只用于传递给其他进程。