为什么发电机不能酸洗?

2023-12-29

Python 的 pickle(我这里说的是标准 Python 2.5/2.6/2.7)不能 pickle 锁、文件对象等。

它也不能 pickle 生成器和 lambda 表达式(或任何其他匿名代码),因为 pickle 实际上只存储名称引用。

如果存在锁和依赖于操作系统的功能,原因如下:why你不能腌制它们,这是显而易见的,也是有道理的。

But 为什么不能 pickle 生成器?


Note:只是为了清楚起见 - 我对根本原因感兴趣(或设计决策中的假设和选择)why,而不是“因为它会给你一个 Pickle 错误”。

我意识到这个问题有点宽泛,所以这里有一个经验法则来判断你是否回答这个问题:“如果提出这些假设,或者允许的发电机类型在某种程度上受到更多限制,酸洗发电机会再次工作吗?”


有很多关于此的信息。有关该问题的“官方说法”,请阅读(已关闭)Python bugtracker 问题 http://bugs.python.org/issue1092962.

做出该决定的人之一详细阐述了核心推理这个博客 http://peadrop.com/blog/2009/12/29/why-you-cannot-pickle-generators/:

由于生成器本质上是一个增强的函数,因此我们需要保存它的字节码(这不能保证在 Python 版本之间向后兼容)及其框架(保存生成器的状态,例如局部变量、闭包和指令指针。后者实现起来相当麻烦,因为它基本上需要使整个解释器变得可腌制。因此,任何对 pickling 生成器的支持都需要对 CPython 的核心进行大量更改。

现在,如果 pickle 不支持的对象(例如,文件句柄、套接字、数据库连接等)出现在生成器的局部变量中,则该生成器无法自动 pickle,无论我们可能对生成器有任何 pickle 支持如何实施。因此,在这种情况下,您仍然需要提供自定义__getstate__ and __setstate__方法。这个问题使得对生成器的任何酸洗支持都相当有限。

并提到了两个建议的解决方法:

不管怎样,如果你需要这样的功能,那么可以看看 Stackless Python,它可以完成上述所有功能。由于 Stackless 的解释器是可挑选的,因此您还可以免费获得流程迁移。这意味着您可以中断一个tasklet(Stackless 绿色线程的名称),对其进行pickle,将pickle 发送到另一台机器,取消pickle,恢复tasklet,然后瞧,您刚刚迁移了一个进程。这是一个非常酷的功能!

但以我的拙见,解决这个问题的最佳解决方案是将生成器重写为简单的迭代器(即带有__next__方法)。迭代器在空间上可以轻松高效地进行 pickle,因为它们的状态是明确的。然而,您仍然需要显式地处理表示某些外部状态的对象;你无法回避这个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么发电机不能酸洗? 的相关文章

  • 阻止 TensorFlow 访问 GPU? [复制]

    这个问题在这里已经有答案了 有没有一种方法可以纯粹在CPU上运行TensorFlow 我机器上的所有内存都被运行 TensorFlow 的单独进程占用 我尝试将 per process memory fraction 设置为 0 但未成功
  • 如何覆盖 Django 的默认管理模板和布局

    我正在尝试覆盖 Django 的默认模板 现在只有base site html 我正在尝试更改 django 管理文本 我做了以下事情 我在我的应用程序目录中创建了一个文件夹 opt mydjangoapp templates admin
  • 上传时的 Google Drive API——这些额外的空行从何而来?

    总结一下该程序 我从我的 Google 云端硬盘下载一个文件 然后在本地计算机中打开并读取一个文件 file a txt 然后在我的计算机中打开另一个文件 file b txt 处于附加模式 并且在使用这个新的 file b 更新我的 Go
  • 嵌套字典中的 Django 模板

    我正在使用 Django 模板 并且遇到了嵌套字典的一个问题 Dict result dict type 0 file name abc count 0 type 1 file name xyz count 50 我的 HTML 文件中的模
  • NumPy linalg.eig

    我有这个烦人的问题 但我还没有弄清楚 我有一个矩阵 我想找到特征向量 所以我写 val vec np linalg eig mymatrix 然后我得到了 vec 我的问题是 当我小组中的其他人对相同的矩阵 mymatrix 做同样的事情时
  • Pandas dataframe:每批行的操作

    我有一个熊猫数据框df我想计算每批行的一些统计信息 例如 假设我有一个batch size 200000 对于每批batch sizerows 我想要一列的唯一值的数量ID我的数据框 我怎样才能做这样的事情呢 这是我想要的一个例子 prin
  • PyTorch 给出 cuda 运行时错误

    我对我的代码做了一些小小的修改 以便它不使用 DataParallel and DistributedDataParallel 代码如下 import argparse import os import shutil import time
  • ValueError:不支持连续[重复]

    这个问题在这里已经有答案了 我正在使用 GridSearchCV 进行线性回归的交叉验证 不是分类器也不是逻辑回归 我还使用 StandardScaler 对 X 进行标准化 我的数据框有 17 个特征 X 和 5 个目标 y 观察 约11
  • Pandas:如何将数据框插入 Clickhouse

    我正在尝试将 Pandas 数据框插入 Clickhouse 这是我的代码 import pandas import sqlalchemy as sa uri clickhouse default localhost default ch
  • Python:我不明白 sum() 的完整用法

    当然 我明白你使用 sum 与几个数字 然后它总结所有 但我正在查看它的文档 我发现了这一点 sum iterable start 第二个参数 start 的作用是什么 这太尴尬了 但我似乎无法通过谷歌找到任何示例 并且对于尝试学习该语言的
  • 使用 Conda 更新特定模块会删除大量软件包

    我最近开始使用 Anaconda Python 发行版 因为它提供了许多开箱即用的数据分析库 使用 conda 创建环境和安装软件包也轻而易举 但是当我想更新 Python 本身或任何其他模块时 我遇到了一些严重的问题 我事先被告知我的很多
  • 为什么我应该使用 WSGI?

    使用 mod python 一段时间了 我读了越来越多关于 WSGI 有多好的文章 但没有真正理解为什么 那么我为什么要切换到它呢 有什么好处 这很难吗 学习曲线值得吗 为了用 Python 开发复杂的 Web 应用程序 您可能会使用更全面
  • 使用 NLP 进行地址分割

    我目前正在开发一个项目 该项目应识别地址的每个部分 例如来自 str Jack London 121 Corvallis ARAD ap 1603 973130 输出应如下所示 street name Jack London no 121
  • 以编程方式使用 Sphinx 特定指令解析 .rst 文件

    我希望能够在 Python 中解析基于 sphinx 的 rst 以便进一步处理和检查 就像是 import sphinx p sphinx parse path to file rst do something with p 似乎在 do
  • sqlite3从打印数据中删除括号

    我创建了一个脚本 用于查找数据库第一行中的最后一个值 import sqlite3 global SerialNum conn sqlite3 connect MyFirstDB db conn text factory str c con
  • 附加两个具有相同列、不同顺序的数据框

    我有两个熊猫数据框 noclickDF DataFrame 0 123 321 0 1543 432 columns click id location clickDF DataFrame 1 123 421 1 1543 436 colu
  • 计算互相关函数?

    In R 我在用ccf or acf计算成对互相关函数 以便我可以找出哪个移位给我带来最大值 从它的外观来看 R给我一个标准化的值序列 Python 的 scipy 中是否有类似的东西 或者我应该使用fft模块 目前 我正在这样做 xcor
  • bs4 `next_sibling` VS `find_next_sibling`

    我在使用时遇到困难next sibling 并且类似地与next element 如果用作属性 我不会得到任何返回 但如果用作find next sibling or find next 然后就可以了 来自doc https www cru
  • 通过 Web 界面执行 python 单元测试

    是否可以通过 Web 界面执行单元测试 如果可以 如何执行 EDIT 现在我想要结果 对于测试 我希望它们是自动化的 可能每次我对代码进行更改时 抱歉我忘了说得更清楚 EDIT 这个答案此时已经过时了 Use Jenkins https j
  • python 日志记录会刷新每个日志吗?

    当我使用标准模块将日志写入文件时logging 每个日志会分别刷新到磁盘吗 例如 下面的代码会将日志刷新 10 次吗 logging basicConfig level logging DEBUG filename debug log fo

随机推荐

  • 将搜索框添加到母版页

    我正在尝试将搜索框添加到 ASP Net MVC Web 应用程序中的母版页 让我困惑的是如何在母版页中正确实现它 那么用户在这个搜索框中输入数据 从MVC的角度应该如何处理数据 我知道我可以使用他母版页的代码 但我不应该 我目前正在尝试为
  • 使用“Is Null”作为基于表单的条件

    如果勾选了表单上的单选框 我试图让我的查询仅返回空记录 如果我在查询中手动包含条件为空 它就可以正常工作 而在其他地方则可以 IIf Forms Reports Status Active True Active 工作得很好 然而 IIf
  • 在Java中如何确定仿射变换的矩形是否包含某个点?

    我正在尝试制作一个交互式 GUI 但每当单击 拖动该矩形时 我都需要移动某个对象 基本上我想知道一个经过仿射变换的矩形是否包含一个特定的点 x y 有没有办法做到这一点 我尝试过使用contains 方法 但它不适用于已进行仿射变换的矩形
  • Log4j2 SyslogAppender 不工作

    我正在使用 Log4j 版本 2 1 最新的稳定版本 并尝试使用 Syslog 附加程序来记录到 syslog 服务器 我正在使用他们官方网站上给出的配置 http logging apache org log4j 2 x manual a
  • 有没有办法将 Python Shell 输出放入 tkinter 窗口中?

    我想知道是否有可能 如果可以的话 如何 拥有Python Shella 内的输出和输入tkinter我制作的窗户 我在谷歌上搜索但似乎找不到任何东西 如果可以的话 有没有一个初学者可以理解的简短版本 我尝试过的所有网站都无法理解 这是我得到
  • ElasticSearch 完成建议器标准分析器不工作

    我们正在使用 ElasticSearch完成建议者 https www elastic co guide en elasticsearch reference current search suggesters completion htm
  • Google+ JavaScript API 是否具有与 Facebook 的signed_request 等效的功能?

    The Google 登录按钮 https developers google com web signin 与Facebook登入 https developers facebook com docs technical guides l
  • XJC - 编译器无法支持此类自定义

    我想从我的 Java 项目中调用 ISAN Restful API 因此我尝试使用 maven jaxb2 plugin 从 xsd 文件生成 java bean 以下是 xsd http www isan org schema v1 11
  • 使用 url_for 函数为 Flask 测试客户端生成 URL

    我正在尝试使用 pytest 为 Flask 应用程序编写单元测试 我有一个应用程序工厂 def create app from flask import Flask app Flask name app config from objec
  • 最新更新后,使用 Xamarin for iOS 播放视频出现问题

    在 Xamarin for iOS 更新到 v2 0 50727 之前 Xamarin for iOS 中的以下代码运行良好 这是 Xamarin Forms 应用程序中自定义渲染器中的代码 class WatchVideoRenderer
  • 尚未为数据源“请求”提供数据源实例

    我的报告查看器出现错误 我不知道如何纠正这个错误 我收到的错误是 尚未为数据源 请求 提供数据源实例 我尝试过搜索此内容 但找不到任何我认为错误的内容 有人可以指出我正确的方向吗 这就是我的reportvierer 的样子
  • Pharo Smalltalk 中 = 和 == 有什么区别?

    有什么区别 and 在 Pharo Smalltalk 中 他们叫什么名字 一个isEqual和另一个 equality inequality deep equality inequality shallow 需要考虑的一件重要的事情是 不
  • 如何使用 R 和 ggplot2 使 comment_custom() grob 与 scale_y_reverse() 一起显示?

    我是新来的ggplot2对 R 来说相对较新 我可以使图片出现在绘图上 并且可以使 y 轴反向缩放 但我不知道如何同时执行这两个操作 例如 library ggplot2 y c 1 2 3 x c 0 0 0 d data frame x
  • Tomcat 8 示例:缺少配置步骤

    我正在尝试在 Tomcat 8 上设置 Echo websocket 示例 我相信我错过了告诉 tomcat 有关 websocket 类的步骤 这是我所做的 在 Eclipse 中创建了一个新的动态 Web 项目 添加了 maven 并链
  • 按升序对对象数组进行排序,但将所有零放在末尾

    如果我有一个对象数组 val 0 val 1 val 0 val 3 如何按升序对其进行排序 但将零保留在末尾 如下所示 val 1 val 3 val 0 val 0 正如预期的那样 排序将零放在顶部 即使我添加逻辑来对末尾的零进行排序
  • 使用可重用模式进行 D3 语义缩放

    我正在尝试在使用 Mike Bostock 的同时实现语义缩放迈向可重用图表 https bost ocks org mike chart 模式 其中图表表示为函数 在我的缩放处理程序中 我想使用转换 rescaleX 更新我的比例 然后只
  • Oracle 日期“Between”查询

    我使用的是oracle数据库 我想执行一个查询来检查两个日期之间的数据 NAME START DATE Small Widget 15 JAN 10 04 25 32 000000 PM Product 1 17 JAN 10 04 31
  • 这个语法是什么 isNaN(+str!)

    找到了here https github com vuetifyjs vuetify blob 4d03847cce58569c285da7cc4328ea0b0ebd45d1 packages vuetify src util helpe
  • 在 gscatter 中获得更合理颜色的简单方法

    我正在寻找一种简单的方法来获得gscatter选择更合理的颜色 如下图所示 第 3 组和第 4 组的颜色非常相似 很难区分 我正在使用绘制我的数据gscatter X 1 X 4 assigns 我知道我可以使用scatter通过创建一个与
  • 为什么发电机不能酸洗?

    Python 的 pickle 我这里说的是标准 Python 2 5 2 6 2 7 不能 pickle 锁 文件对象等 它也不能 pickle 生成器和 lambda 表达式 或任何其他匿名代码 因为 pickle 实际上只存储名称引用