Как бы я это сделал:
Определяет фактический код обработки в классе, и в этом классе я реализую протокол Pickle (http://docs.python.org/library/pickle.html) (в основном, пишу правильные функции __getstate__
и __setstate__
)
Этот класс будет принимать имя файла, сохранять открытый файл и экземпляр средства чтения CSV в качестве членов экземпляра. Метод __getstate__
сохранит текущую позицию файла, а setsets откроет файл, переместит его в нужную позицию и создаст новое средство чтения.
Я бы выполнил актуальную работу в методе __iter__
, который передавал бы внешнюю функцию после обработки каждой строки.
Эта внешняя функция будет запускать вход мониторинга "основного цикла" для прерываний (сокетов, клавиатуры, состояния конкретного файла в файловой системе и т. Д.) - все будет тихо, просто вызовет следующую итерацию процессор. Если произойдет прерывание, оно будет отображать состояние процессора для конкретного файла на диске.
При запуске программа просто должна проверить, есть ли сохраненное выполнение, если это так, используйте pickle для извлечения объекта-исполнителя и возобновите основной цикл.
Здесь приведен некоторый (непроверенный) код - iea достаточно прост:
from cPickle import load, dump
import csv
import os, sys
SAVEFILE = "running.pkl"
STOPNOWFILE = "stop.now"
class Processor(object):
def __init__(self, filename):
self.file = open(filename, "rt")
self.reader = csv.reader(self.file)
def __iter__(self):
for line in self.reader():
# do stuff
yield None
def __getstate__(self):
return (self.file.name, self.file.tell())
def __setstate__(self, state):
self.file = open(state[0],"rt")
self.file.seek(state[1])
self.reader = csv.reader(self.File)
def check_for_interrupts():
# Use your imagination here!
# One simple thing would e to check for the existence of an specific file
# on disk.
# But you go all the way up to instantiate a tcp server and listen to
# interruptions on the network
if os.path.exists(STOPNOWFILE):
return True
return False
def main():
if os.path.exists(SAVEFILE):
with open(SAVEFILE) as savefile:
processor = load(savefile)
os.unlink(savefile)
else:
#Assumes the name of the .csv file to be passed on the command line
processor = Processor(sys.argv[1])
for line in processor:
if check_for_interrupts():
with open(SAVEFILE, "wb") as savefile:
dump(processor)
break
if __name__ == "__main__":
main()