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.