gpt4 book ai didi

python - 自行 pickle 并返回运行状态?

转载 作者:太空宇宙 更新时间:2023-11-03 19:21:27 30 4
gpt4 key购买 nike

我发现以下帖子非常有帮助: How to pickle yourself?

但是,此解决方案的局限性在于,重新加载类时,它不会以其“运行时”状态返回。即它将重新加载所有变量等以及类在转储时的一般状态..但它不会从该点继续运行。

考虑:

class someClass(object):
def doSomething(self):
i = 0
while i <= 20:
execute
i += 1
if i == 10:
self.dumpState()

def dumpState(self):
with open('somePickleFile','wb') as handle:
pickle.dump(self, handle)

@classmethod
def loadState(cls, file_name):
with open(file_name, 'rb') as handle:
return pickle.load(handle)

如果运行上面的代码,则通过创建 someClass 的实例:

 sC = someClass()
sC.doSomething()
sC.loadState('somePickleFile')

这不会将类返回到其运行时状态,它不会继续执行 while 循环,直到 i == 20..

这可能不是正确的方法,但我正在尝试找到一种方法来捕获程序的运行时状态,即卡住/休眠它,然后在可能将其移动到另一台机器后重新启动它。这是由于我遇到了不支持检查点的集群上的排队系统强制执行时间限制的问题。

最佳答案

在您的代码不知道的情况下,仅使用 Pickle 和 Unpickle 是不可能实现这种方法的。

Pickle 可以保存基本的 Python 对象以及引用这些基本类型的普通用户类。但它无法根据需要卡住正在运行的上下文的信息。

Python 确实允许通过其框架对象访问正在运行的代码上下文的有限(但功能强大)的方式 - 您可以通过调用检查模块中的“inspect.currentframe”来获取框架对象。这将允许你看到当前运行的代码行、局部变量、局部变量的内容等等——但是在纯Python中没有办法,不诉诸Python解释器的数据结构的原始内存操作来重建一个中间执行帧对象并将执行跳转到那里。

因此,对于这种方法,最好使用操作系统“卡住”整个进程及其内存数据结构。这样做的方法(在Linux中可能有一种方法,它应该在进程使用的没有文件/文件之类的资源的情况下工作)。

或者,从 Python 内部,如您所愿,您必须以 Pickle 能够“查看”的方式对所有状态数据进行“簿记检查”。在您的基本示例中,您应该将代码重构为:

class someClass(object):
def setup(self):
self.i = 0
def doSomething(self):
while self.i <= 20:
execute
i += 1
if i == 10:
self.dumpState()
...
@classmethod
def loadState(cls, file_name):
with open(file_name, 'rb') as handle:
self = pickle.load(handle)
if self.i <= 20: # or other check for "running context"
return self.doSomething()

这里的根本区别是将本地“i”变量作为对象变量进行记账,并将初始化代码分开。通过这种方式,继续执行所需的所有状态 - 对于这个小示例 - 都记录在对象属性上 - 可以正确 pickle 。

关于python - 自行 pickle 并返回运行状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9585413/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com