多处理initargs-它是如何工作的?

1l5u6lss  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(301)

我认为 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 是创建的。

i2byvkas

i2byvkas1#

如果您传递了multiprocessing.lock()的示例,则错误消息将是runtimeerror:lock对象只能通过继承在进程之间共享。如果您正在创建 multiprocessing.Process ,这实际上是当您说initializer=worker,initargs=(value,)时使用的。正在进行的测试是当前是否正在生成一个进程,而当您已经有一个现有的进程池并且现在正在提交一些工作时,情况就不是这样了。但为什么会有这样的限制?
您可以将共享内存pickle到一个文件中,然后在一周后尝试取消pickle并使用它,这有意义吗?当然不是!python无法知道您不会做这样愚蠢的事情,因此它对共享内存和锁的pickle/unpickle设置了很大的限制,这只用于传递给其他进程。

相关问题