Escribí el script de Python que procesa una gran cantidad de archivos de texto grandes y puede durar mucho tiempo . A veces, es necesario detener la secuencia de comandos en ejecución y reanudarla más tarde. Las posibles razones para detener la secuencia de comandos son un locking del progtwig, una situación de “falta de espacio” del disco o muchas otras cuando tiene que hacerlo. Quiero implementar un tipo de mecanismo de “detener / reanudar” para el script.
Voy a implementarlo utilizando los módulos pickle y señal .
Estaré encantado de escuchar cómo hacerlo de forma pythonica.
¡Gracias!
Aquí hay algo simple que con suerte te puede ayudar:
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
Ejemplo de ejecución:
$ 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
Si está buscando leer archivos grandes, solo use un identificador de archivos y lea las líneas una a la vez, procesando cada línea como sea necesario. Si desea guardar la sesión de python, solo use dill.dump_session
y se guardarán todos los objetos existentes. Otras respuestas fallarán ya que pickle
no puede encurtir un identificador de archivo. dill
, sin embargo, puede serializar casi todos los objetos de Python, incluido un identificador de archivo.
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') >>>
Luego salga de la sesión de python y reinicie. Cuando load_session
, carga todos los objetos que existían en el momento de la llamada a 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() >>>
Simple como eso.
Obtenga dill
aquí: https://github.com/uqfoundation
La ejecución podría suspender su vida útil, o (aparte de las excepciones de seguridad), el estado del script puede ser pickle
, comprimido y almacenado.
http://docs.python.org/library/pickle.html
http://docs.python.org/library/marshal.html
http://docs.python.org/library/stdtypes.html (5.9)