2009-05-19 20 views
7

Estoy intentando ejecutar una aplicación de procesos múltiples simple en Python. El hilo principal genera de 1 a N procesos y espera hasta que todos hayan terminado el procesamiento. Los procesos de cada carrera en un bucle infinito, por lo que potencialmente puede funcionar para siempre, sin alguna interrupción del usuario, por lo que poner en algún código para manejar un KeyboardInterrupt:Python Multiprocesamiento atexit Error "Error en atexit._run_exitfuncs"

#!/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 cuando se utiliza CTRL-C para salir, me Obtenga un error adicional aunque los procesos parezcan 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.

Respuesta

1

En lugar de simplemente forzar sys.exit(), desea enviar una señal a sus hilos para indicarles que se detengan. Examine el uso de signal handlers 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. Sin embargo, no creo que sea una buena práctica.

+0

Si es posible, puede agregar un ejemplo ejecutable de esta solución. – cmcginty

Cuestiones relacionadas