您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么不能腌制发电机?

为什么不能腌制发电机?

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

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

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

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

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

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

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

其他 2022/1/1 18:36:42 有358人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶