为什么 python 中的多处理模块需要 pickle

Why is pickle needed for multiprocessing module in python

我在 python 中进行多处理时遇到了 pickling 错误。这让我想知道为什么我们需要腌制对象才能进行多处理? fork() 还不够吗?

编辑: 我有点明白为什么我们需要 pickle 来进行进程间通信,但这只是为了您要传输的数据,对吗?为什么 multiprocessing 模块也尝试 pickle 函数等东西?

Which makes me wonder why do we need to pickle the object in order to do multiprocessing?

我们不需要pickle,但是确实需要进程间通信,而pickle恰好是一个Python. 非常方便、快捷、通用的序列化方法 序列化是进程间通信的一种方式。内存共享是另一个。与内存共享不同,进程甚至不需要在同一台机器上进行通信。例如,PySpark 大量使用序列化在执行器(通常是不同的机器)之间进行通信。

附录: 在 Python 中共享内存时,GIL(全局解释器锁)也存在问题(详情请参阅下面的评论)。

isn't fork() enough?

如果您希望您的进程在 分叉后进行通信和共享数据,则不可以。 fork() 克隆当前的内存 space,但一个进程中的更改不会在 fork 后反映到另一个进程中(当然,除非我们明确共享数据)。

I kind of get why we need pickle to do interprocess communication, but that is just for the data you want to transfer right? why does the multiprocessing module also try to pickle stuff like functions etc?

  1. 有时复杂的对象(即 "other stuff"?不完全清楚你在这里的意思)包含你想要操作的数据,所以我们肯定希望能够发送那个"other stuff".

  2. 能够将函数发送到另一个进程非常有用。您可以创建一堆子进程处理,然后向它们发送一个函数以同时执行,您稍后在程序中定义该函数。这本质上是 PySpark 的症结所在(又有点跑题了,因为 PySpark 不是 multiprocessing,但感觉奇怪地相关)。

  3. 有一些函数纯粹主义者(主要是 LISP 人)认为代码和数据是一回事。所以对于一些人来说,这并不是什么难事。