首页 > 解决方案 > 为什么python中的多处理模块需要pickle

问题描述

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

编辑:我有点明白为什么我们需要 pickle 来进行进程间通信,但这只是为了你想要传输的数据,对吧?为什么多处理模块还尝试腌制函数等内容?

标签: pythonmultiprocessingpickle

解决方案


这让我想知道为什么我们需要腌制对象才能进行多处理?

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

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

fork() 还不够吗?

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

我有点明白为什么我们需要 pickle 来进行进程间通信,但这只是为了你想要传输的数据,对吧?为什么多处理模块还尝试腌制函数等内容?

  1. 有时复杂的对象(即“其他东西”?不完全清楚你在这里的意思)包含你想要操作的数据,所以我们肯定希望能够发送那些“其他东西”。

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

  3. 有一些功能纯粹主义者(主要是 LISP 人)认为代码和数据是同一件事。因此,对于某些人来说,这不是一条线。


推荐阅读