我寫了Python腳本,可以處理大量的大文本文件,並且可以運行很多時間。有時候,需要停止正在運行的腳本並稍後恢復。停止腳本的可能原因是程序崩潰,磁盤「空間不足」情況或許多其他情況,因此您必須執行該操作。我想爲腳本實現一種「停止/恢復」機制。如何「停止」和「恢復」長時間運行Python腳本?
- 在停止:腳本退出&保存其當前狀態。
- 在簡歷:劇本開始,但是從最新的保存狀態
繼續我要去使用泡菜和信號模塊來實現它。
我很高興聽到如何以pythonic的方式做到這一點。
謝謝!
我寫了Python腳本,可以處理大量的大文本文件,並且可以運行很多時間。有時候,需要停止正在運行的腳本並稍後恢復。停止腳本的可能原因是程序崩潰,磁盤「空間不足」情況或許多其他情況,因此您必須執行該操作。我想爲腳本實現一種「停止/恢復」機制。如何「停止」和「恢復」長時間運行Python腳本?
繼續我要去使用泡菜和信號模塊來實現它。
我很高興聽到如何以pythonic的方式做到這一點。
謝謝!
下面是一些簡單的希望可以幫助您:
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
OP想要處理多個文本文件。所以,全局變量中應該有文件句柄。 'pickle'不能序列化文件句柄。因此,一般來說,你的答案不應該起作用,特別是對於OP想要的東西。 – 2015-03-13 02:21:37
執行可能睡眠它的生命消失,或者(除了安全例外),腳本的狀態可以是pickle
d,壓縮並存儲。
http://docs.python.org/library/pickle.html
http://docs.python.org/library/marshal.html
http://docs.python.org/library/stdtypes.html(5.9)
如果您正在尋找讀取大文件時,只使用一個文件句柄,並閱讀每行一行,根據需要處理每一行。如果您想保存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
調用時存在的所有對象。
[email protected]>$ 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()
>>>
這樣簡單。
獲取dill
這裏:https://github.com/uqfoundation
您可能需要一些外部的控制,如計劃任務(或在Linux cron作業)。此外,在程序停止時,向磁盤上的特定文件寫入一些狀態信息,以便程序在重新啓動時知道該怎麼做 – inspectorG4dget 2011-06-09 21:37:11
如果在* nix系統上,可以使用標準的SIGSTOP和SIGCONT信號,但該過程將保持在(虛擬)內存直到繼續。 – tzot 2011-06-10 09:25:02