python process interrupt atexit

Python Multiprocesamiento atexit Error "Error en atexit._run_exitfuncs"



process interrupt (1)

Estoy intentando ejecutar una aplicación simple de procesos múltiples en Python. El hilo principal genera de 1 a N procesos y espera hasta que todos hayan terminado el procesamiento. Cada uno de los procesos ejecuta un bucle infinito, por lo que pueden ejecutarse para siempre sin interrupción del usuario, así que puse un 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, recibo un error adicional aunque 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

Estoy ejecutando Python 2.6 en Windows. Si hay una forma mejor de manejar el multiprocesamiento en Python, házmelo saber.


En lugar de simplemente forzar sys.exit() , desea enviar una señal a sus hilos para pedirles que se detengan. Considere usar manejadores de señal y subprocesos en Python.

Podrías hacer esto cambiándote while True: loop to be while keep_processing: donde keep_processing es algún tipo de variable global que se establece en la excepción KeyboardInterrupt. Sin embargo, no creo que sea una buena práctica.