Pregunta

Estoy tratando de ejecutar una aplicación sencilla de múltiples procesos en Python. El hilo principal genera 1 a N procesos y espera hasta que todos se hacen de procesamiento. Los procesos se ejecutan cada uno un bucle infinito, por lo que potencialmente puede funcionar para siempre, sin interrupción alguna del usuario, por lo que poner en algún código para manejar un KeyboardInterrupt:

#!/usr/bin/env python
import sys
import time
from multiprocessing import Process

def main():
    # Set up inputs..

    # Spawn processes
    Proc( 1).start()
    Proc( 2).start()

class Proc ( Process ):
    def __init__ ( self, procNum):
        self.id = procNum
        Process.__init__(self)

    def run ( self ):
        doneWork = False

        while True:

            try:
                # Do work...
                time.sleep(1)
                sys.stdout.write('.')

                if doneWork:
                    print "PROC#" + str(self.id) + " Done."
                    break

            except KeyboardInterrupt:
                print "User aborted."
                sys.exit()

# Main Entry
if __name__=="__main__":
    main()

El problema es que al usar CTRL-C para salir, me sale un error adicional a pesar de que los procesos parecen salir inmediatamente:

......User aborted.
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "C:\Python26\lib\atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "C:\Python26\lib\multiprocessing\util.py", line 281, in _exit_function
    p.join()
  File "C:\Python26\lib\multiprocessing\process.py", line 119, in join
    res = self._popen.wait(timeout)
  File "C:\Python26\lib\multiprocessing\forking.py", line 259, in wait
    res = _subprocess.WaitForSingleObject(int(self._handle), msecs)
KeyboardInterrupt
Error in sys.exitfunc:
Traceback (most recent call last):
  File "C:\Python26\lib\atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "C:\Python26\lib\multiprocessing\util.py", line 281, in _exit_function
    p.join()
  File "C:\Python26\lib\multiprocessing\process.py", line 119, in join
    res = self._popen.wait(timeout)
  File "C:\Python26\lib\multiprocessing\forking.py", line 259, in wait
    res = _subprocess.WaitForSingleObject(int(self._handle), msecs)
KeyboardInterrupt

Me postulo Python 2.6 en Windows. Si hay una mejor manera de manejar el multiprocesamiento en Python, por favor hágamelo saber.

¿Fue útil?

Solución

En lugar de simplemente forzando sys.exit(), desea enviar una señal a sus hilos para decirles que se detengan. Mira en el uso de manejadores de señales y los hilos en Python.

Usted podría hacer esto cambiando su bucle while True: ser while keep_processing: donde keep_processing es algún tipo de variable global que se vuelve a establecer en la excepción KeyboardInterrupt. No creo que esto es una buena práctica, sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top