关于此的信息很多。有关该问题的“正式用语”,请阅读(已关闭)Python Bugtracker问题。
该博客详细介绍了做出决定的人之一的核心推理:
由于生成器本质上是一个强大的功能,因此我们需要保存其字节码,这不能保证在Python版本及其框架之间可以向后兼容,该框架保留了生成器的状态,例如局部变量,闭包和指令指针。后者很难完成,因为它基本上需要使整个解释器可腌制。因此,对酸洗生成器的任何支持都需要对cpython的核心进行大量更改。
现在,如果在生成器的局部变量中出现了不被pickle支持的对象(例如,文件句柄,套接字,数据库连接等),则该生成器将无法自动进行pickle,无论我们可能对pickle的支持是否支持pickle实行。因此,在这种情况下,您仍然需要提供自定义__getstate__
和__setstate__
方法。这个问题使得对酸洗机的任何酸洗支持都相当有限。
并提到了两个建议的解决方法:
无论如何,如果您需要这样的功能,请查看可完成上述所有操作的stackless Python。而且,由于stackless的解释器是可提取的,因此您还可以免费获得进程迁移。这意味着您可以中断小任务(stackless的绿色线程的名称),对其进行腌制,将其发送到另一台机器,对其进行腌制,继续执行该小任务,然后迁移刚刚迁移的进程。这真是太酷了!
但是,以我的拙见,将这个生成器重写为简单的迭代器(即带有__next__
方法的迭代器)是解决此问题的最佳方法。因为迭代器的状态是明确的,所以它们在空间上很容易进行腌制。但是,您仍然需要处理显式表示某些外部状态的对象。你无法解决这个问题。