多处理初始化是如何在引擎盖下工作的?

2024-05-12 12:44:16 发布

您现在位置:Python中文网/ 问答频道 /正文

  1. 我假设multiprocessing.Pool使用pickleinitargs传递给子进程

然而,我发现以下观点:

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如何绕过这一点,因为它也使用pickle

  1. 据我所知,multiprocessing.Value在幕后使用共享内存,继承与通过initargs传递之间有什么区别?具体来说,在Windows上,代码不会分叉,因此会创建一个新的multiprocessing.Value实例

Tags: 进程valuemultiprocessingpickleworkerpoolinitializerworks
1条回答
网友
1楼 · 发布于 2024-05-12 12:44:16

如果您传递了multiprocessing.Lock()的实例,则错误消息应该是RuntimeError:Lock对象只能通过继承在进程之间共享。如果您正在创建multiprocessing.Process的实例,则可以将这些内容作为参数传递,这实际上就是当您说initializer=worker,initargs=(value,)时所使用的。正在进行的测试是当前是否正在生成一个进程,而当您已经有一个现有的进程池并且现在正在提交一些工作时,情况就不是这样了。但为什么会有这样的限制

您可以将共享内存pickle到一个文件中,然后在一周后尝试取消pickle并使用它,这有意义吗?当然不是!Python无法知道您不会做这样愚蠢的事情,因此它对共享内存和锁的pickle/unpickle设置了很大的限制,这只用于传递给其他进程

相关问题 更多 >