python - 为什么python中的多处理模块需要pickle
问题描述
我在 python 中进行多处理并遇到了酸洗错误。这让我想知道为什么我们需要腌制对象才能进行多处理?fork() 还不够吗?
编辑:我有点明白为什么我们需要 pickle 来进行进程间通信,但这只是为了你想要传输的数据,对吧?为什么多处理模块还尝试腌制函数等内容?
解决方案
这让我想知道为什么我们需要腌制对象才能进行多处理?
我们不需要 pickle
,但我们确实需要进程之间的通信,并且pickle
恰好是 Python 的一种非常方便、快速和通用的序列化方法。序列化是进程间通信的一种方式。内存共享是另一个。与内存共享不同,进程甚至不需要在同一台机器上进行通信。例如,PySpark 大量使用序列化来在执行程序(通常是不同的机器)之间进行通信。
附录:在 Python 中共享内存时,GIL(全局解释器锁)也存在问题(有关详细信息,请参阅下面的评论)。
fork() 还不够吗?
如果您希望您的进程在分叉后进行通信和共享数据,则不会。 fork()
克隆当前内存空间,但一个进程中的更改不会在分叉后反映在另一个进程中(当然,除非我们明确共享数据)。
我有点明白为什么我们需要 pickle 来进行进程间通信,但这只是为了你想要传输的数据,对吧?为什么多处理模块还尝试腌制函数等内容?
有时复杂的对象(即“其他东西”?不完全清楚你在这里的意思)包含你想要操作的数据,所以我们肯定希望能够发送那些“其他东西”。
能够将函数发送到另一个进程是非常有用的。您可以创建一堆子进程,然后将它们全部发送给您稍后在程序中定义的同时执行的函数。这本质上是 PySpark 的症结所在(又有点跑题了,因为 PySpark 不是
multiprocessing
,但感觉奇怪的是相关的)。有一些功能纯粹主义者(主要是 LISP 人)认为代码和数据是同一件事。因此,对于某些人来说,这不是一条线。
推荐阅读
- vue.js - VueJS - 如何为滑块的每 10 个单位设置一个标记/刻度
- jestjs - mocking the internal function of another function using jestjs
- cupy - 索引为零维 cp.array 的 cp.array 慢切片(基于 cp.argmin 结果)
- python - Discord.py 有多个相同命令的命令
- postman - Api 调用在 Talend 和 Insomnia 上的 tRestClient 上给出错误 500,但在 Postman 上给出 200 ok
- c# - 当前上下文中不存在名称 DateTime
- reactjs - 如何将列表从一个组件共享到另一个组件?
- arrays - 将来自多个 IF 函数的数据合并到一个单元格中
- angular - 无法在 Angular 中处理 POST http 响应 html
- sql - 使用 REPLACE 函数更新 SQL Server 表