如何“停止”和“恢复”长时间运行Python脚本?

时间:2011-06-09 21:12:26

标签: python pickle

我编写了Python脚本来处理大量的大型文本文件,可能会运行大量的时间。有时,需要停止正在运行的脚本并在以后恢复它。停止脚本的可能原因是程序崩溃,磁盘“空间不足”情况或许多其他必须执行此操作的情况。我想为脚本实现一种“停止/恢复”机制。

  • 点击停止:脚本退出&保存其当前状态。
  • 恢复:脚本启动,但从最新保存的状态继续

我将使用 pickle 信号模块实现它。

我很高兴听到如何用pythonic方式做到这一点。

谢谢!

3 个答案:

答案 0 :(得分:4)

这里有一些简单的东西可以帮助你:

import time
import pickle


REGISTRY = None


def main(start=0):
    """Do some heavy work ..."""

    global REGISTRY

    a = start
    while 1:
        time.sleep(1)
        a += 1
        print a
        REGISTRY = pickle.dumps(a)


if __name__ == '__main__':
    print "To stop the script execution type CTRL-C"
    while 1:
       start = pickle.loads(REGISTRY) if REGISTRY else 0
        try:
            main(start=start)
        except KeyboardInterrupt:
            resume = raw_input('If you want to continue type the letter c:')
            if resume != 'c':
                break

运行示例:

$ python test.py
To stop the script execution type CTRL-C
1
2
3
^CIf you want to continue type the letter c:c
4
5
6
7
8
9
^CIf you want to continue type the letter c:
$ python test.py

答案 1 :(得分:1)

如果您要阅读大文件,只需使用文件句柄,一次读取一行,根据需要处理每一行。如果你想保存python会话,那么只需使用dill.dump_session - 它将保存所有现有对象。其他答案将失败,因为pickle无法挑选文件句柄。但是,dill可以序列化几乎每个python对象 - 包括文件句柄。

Python 2.7.9 (default, Dec 11 2014, 01:21:43) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> f = open('bigfile1.dat', 'r')
>>> data = f.readline()  
>>> 
>>> dill.dump_session('session.pkl')
>>> 

然后退出python会话,然后重新启动。当您load_session时,您会加载dump_session来电时存在的所有对象。

dude@hilbert>$ python
Python 2.7.9 (default, Dec 11 2014, 01:21:43) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> dill.load_session('session.pkl')
>>> len(data)
9
>>> data += f.readline()
>>> f.close()
>>> 

这很简单。

在此处获取dillhttps://github.com/uqfoundation

答案 2 :(得分:0)