自我酸洗并返回运行状态?

2024-10-03 15:23:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

然而,这种解决方案的局限性是,当类被重新加载时,它不会以“运行时”状态返回。i、 它将重新加载所有变量等以及类在被转储时的一般状态。。但从那时起它就不会继续运行了。在

考虑:

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的实例:

^{pr2}$

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

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


Tags: 方法nameself状态defaswithopen
3条回答

我相信pickle只保留实例的属性值,而不是任何正在执行的方法的内部状态。它不会保存方法正在执行的事实,也不会保存局部变量的值,就像您的示例中的i一样。在

loadState是一个classmethod返回someClass的新实例(或文件中的其他pickle)。所以你应该改为写:

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

如果您的代码没有意识到Pickle和Unpickle是不可能单独使用Pickle和Unpickle的。在

Pickle可以保存基本的Python对象和引用这些基本类型的普通用户类。但它不能冻结正在运行的上下文的信息。在

Python允许通过frame对象访问正在运行的代码上下文的有限方法(但功能强大),您可以通过调用检查电流帧“在检查模块中。这将允许您查看当前正在运行的代码行、局部变量、局部变量的内容等等,但是在纯python中,如果不借助python解释器数据结构的原始内存操作来重建一个中间执行帧对象并将执行跳转到那里,这是不可能的。在

因此,对于这种方法,最好使用O.s.方法来“冻结”整个进程及其内存数据结构(在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处理。在

相关问题 更多 >