¿Cómo “detener” y “reanudar” el tiempo de ejecución del script de Python?

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.

  • En parada : el script se cierra y guarda su estado actual.
  • En la reanudación : el script comienza, pero continúa desde el último estado guardado

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)

http://docs.python.org/library/archiving.html

http://www.henrysmac.org/?p=531