我正在python中进行多处理,遇到了一个酸洗错误。这让我想知道为什么我们需要腌制对象才能进行多处理?fork(( 还不够吗?
编辑:我有点明白为什么我们需要泡菜来进行进程间通信,但这只是为了您要传输的数据,对吗? 为什么多处理模块也尝试腌制函数等东西?
让我想知道为什么我们需要腌制对象才能 做多处理?
我们不需要pickle
,但我们确实需要在进程之间进行通信,pickle
恰好是 Python 的一种非常方便、快速和通用的序列化方法。序列化是在进程之间进行通信的一种方法。内存共享是另一个。与内存共享不同,这些进程甚至不需要在同一台计算机上进行通信。例如,PySpark 大量使用序列化在执行程序(通常是不同的机器(之间进行通信。
附录:在 Python 中共享内存时,GIL(全局解释器锁(也存在问题(有关详细信息,请参阅下面的评论(。
fork(( 还不够吗?
如果您希望进程在分叉后进行通信和共享数据,则不会。fork()
克隆当前的内存空间,但一个进程中的更改不会在分叉后反映在另一个进程中(当然,除非我们明确共享数据(。
我有点明白为什么我们需要泡菜来进行进程间通信,但是 那只是为了您要传输的数据,对吗?为什么 多处理模块还尝试腌制功能等东西?
有时复杂的对象(即"其他东西"?不完全清楚你在这里的意思(包含你想要操作的数据,所以我们肯定希望能够发送"其他东西"。
能够将一个函数发送到另一个进程非常有用。您可以创建一堆子进程,然后向它们发送一个函数以并发执行,稍后在程序中定义该函数。这本质上是 PySpark 的关键(再次有点跑题,因为 PySpark 不是
multiprocessing
,但它感觉奇怪地相关(。有一些函数式纯粹主义者(主要是LISP人(认为代码和数据是一回事。因此,对于某些人来说,划清界限并不多。