2011-06-09 41 views
8

Escribí una secuencia de comandos de Python que procesa una gran cantidad de archivos de texto grandes y puede ejecutar mucho tiempo. En ocasiones, es necesario detener el script en ejecución y reanudarlo más tarde. Las posibles razones para detener el script son la caída del programa, la situación de "falta de espacio" en el disco o muchas otras cuando tiene que hacerlo. Quiero implementar un tipo de mecanismo de "detener/reanudar" para el script.¿Cómo "detener" y "reanudar" la secuencia de comandos de Python?

  • En parada: la secuencia de comandos se cierra & guarda su estado actual.
  • En hoja de vida: la secuencia de comandos se inicia, pero continúa desde el último estado guardado

voy a ponerlo en práctica mediante el salmuera y la señal módulos.

Estaré encantado de escuchar cómo hacerlo de manera pitónica.

¡Gracias!

+0

Es probable que tenga algún tipo de control externo, como una tarea programada (o una tarea programada en Linux).Además, al detener el programa, escriba alguna información de estado en un archivo específico en el disco para que su programa sepa qué hacer cuando se reinicie – inspectorG4dget

+0

Si está en sistemas * nix, puede usar las señales estándar SIGSTOP y SIGCONT, aunque el proceso permanecerá en memoria (virtual) hasta que se continúe. – tzot

Respuesta

4

Aquí es algo simple que se espera que puedan ayudarle a:

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 
+1

El OP quiere procesar una cantidad de archivos de texto. Entonces, debería haber manejadores de archivos en los globales. 'pickle' no puede serializar identificadores de archivo. Por lo tanto, su respuesta no debería funcionar, en general ... y especialmente para lo que quiere el OP. –

1

Si usted está buscando para leer archivos de gran tamaño, sólo tiene que utilizar un identificador de archivo, y leer el líneas de a una por vez, procesando cada línea como necesites. Si desea guardar la sesión de Python, simplemente use dill.dump_session y guardará todos los objetos existentes. Las otras respuestas fallarán ya que pickle no pueden guardar 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') 
>>> 

A continuación, 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 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() 
>>> 

Simple as that.

Get dill aquí: https://github.com/uqfoundation

Cuestiones relacionadas