当前位置: 首页 > 面试题库 >

为什么不能腌制发电机?

杨志强
2023-03-14
问题内容

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

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

在锁和依赖于操作系统的功能的情况下,原因 为何 你不能咸菜他们是明显的,是有道理的。

但是 为什么不能腌制发电机呢?

:只是为了清楚起见, -我有兴趣的根本原因(或假设和进入该设计决策选择) 为什么 ,而不是“因为它给你一个味酸错误”。

我意识到这个问题的目的是广泛的,因此,以下经验法则是您是否回答的:“如果提出了这些假设,或者允许的发生器类型受到更多限制,酸洗发生器会再次起作用吗?”


问题答案:

关于此的信息很多。有关该问题的“正式用语”,请阅读(已关闭)Python
Bugtracker问题

该博客详细介绍了做出决定的人之一的核心推理:

由于生成器本质上是一个强大的功能,因此我们需要保存其字节码,这不能保证在Python版本及其框架之间可以向后兼容,该框架保留了生成器的状态,例如局部变量,闭包和指令指针。后者很难完成,因为它基本上需要使整个解释器可腌制。因此,对酸洗生成器的任何支持都需要对CPython的核心进行大量更改。

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

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

无论如何,如果您需要这样的功能,请查看可完成上述所有操作的Stackless
Python。而且,由于Stackless的解释器是可提取的,因此您还可以免费获得进程迁移。这意味着您可以中断小任务(Stackless的绿色线程的名称),对其进行腌制,将其发送到另一台机器,对其进行腌制,继续执行该小任务,然后迁移刚刚迁移的进程。这真是太酷了!

但是,以我的拙见,将这个生成器重写为简单的迭代器(即带有__next__方法的迭代器)是解决此问题的最佳方法。因为迭代器的状态是明确的,所以它们在空间上很容易进行腌制。但是,您仍然需要处理显式表示某些外部状态的对象。你无法解决这个问题。



 类似资料:
  • 问题内容: 我有一个defaultdict看起来像这样: 问题是,我不能使用cPickle腌制它。我在这里找到的解决方案之一是使用模块级函数而不是lambda。我的问题是,什么是模块级功能?如何在cPickle中使用字典? 问题答案: 除了Martijn的解释之外: 模块级函数是在模块级定义的函数,这意味着它不是类的实例方法,它不嵌套在另一个函数中,并且它是带有名称的“真实”函数,而不是lambd

  • 问题内容: 我正在尝试从servlet发送电子邮件。也不例外,但是我的帐户中没有收到电子邮件。我正在使用以下代码: } 我现在收到以下异常: 谁能告诉我为什么我没有收到电子邮件以及此代码有什么问题。提前致谢 问题答案: 阅读https://developers.google.com/appengine/docs/java/mail/overview 基本上停止在您的应用程序中包含任何JavaMai

  • 我无法向Kafka主题发布消息,无法得到Kafka制作人的任何回应,它完全卡住了应用程序 Kafka生产者服务代码 2021-05-30 13:29:13.209[0;39M[32M信息[0;39M[35M2472[0;39M[2M---[0;39M[2M[nio-8084-exec-2][0;39M[36MO.apache.coyote.http11.HTTP11Processor[0;39M[

  • 下面链接的文档似乎表明可以对顶级类及其实例进行pickle处理。但根据我对前一个问题的回答来看,这似乎不正确。在我发布的脚本中,pickle接受类对象并写入文件,但这没有用。 这是我的问题:这个文档是错误的,还是有更微妙的东西我不明白?另外,在这种情况下,泡菜是否应该生成某种错误消息? https://docs . python . org/2/library/pickle . html # wh

  • 为什么Kafka0.10控制台制作人不能向Kafka0.9发送消息? 为什么新的生产者不能向老的消费者发送信息呢?有没有可能设置一个新的制作人在一种不推荐的模式,以发送消息给老Kafka? $bin\windows\kafka-console-producer.bat--broker-list my_server:9092-topic my_topic [2016-08-30 14:03:53,3

  • 问题内容: 执行此强制转换时出现编译错误: 应该被继承,尽管不能直接继承。 从文档: 农具其中inturn & 为什么这无效? 也感谢您提供有关使用as 的正确方法的意见? 我正在考虑包装方法。 问题答案: 扩展,并且 不 扩展。 如果您想从中获得帮助,我认为实现包装器类是您最简单的选择。幸运的是的唯一抽象方法是。 RandomAccessFile实现了DataInput,该数据输入将依次转为Da