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

时间:2018-10-01 23:39:49

标签: python multiprocessing pickle

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

编辑:我有点理解为什么我们需要使用pickle进行进程间通信,但这仅仅是针对您要传输的数据吗?为什么多处理模块还尝试腌制诸如函数之类的东西?

1 个答案:

答案 0 :(得分:3)

  

这让我想知道为什么我们需要腌制该物品才能   做多处理吗?

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

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

  

fork()还不够吗?

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

  

我有点理解为什么我们需要泡菜来进行进程间通信,但是   仅用于您要传输的数据吗?为什么   多处理模块还尝试腌制诸如函数之类的东西吗?

  1. 有时候,复杂的对象(即“其他东西”?在这里不是很清楚您的意思)包含您要操纵的数据,因此我们绝对希望能够发送该“其他东西”。

  2. 能够将功能发送到另一个进程非常有用。。您可以创建一堆子进程,然后将所有子进程发送给它们以执行功能并在稍后的程序中定义。从本质上讲,这是PySpark的症结所在(由于PySpark不是multiprocessing,但感觉很相关,因此有点离题)。

  3. 有些功能纯粹主义者(大多数是LISP人士)提出了论证,认为代码和数据是同一回事。因此,画一些线并不多。