2010-02-11 10 views
6

Soy nuevo en Python y estoy probando un programa de multiprocesamiento.pool para procesar archivos, funciona bien siempre y cuando no haya excepciones. Si alguna de la rosca/proceso obtiene una excepción todo el programa espera a que el hilomultiprocesamiento El grupo se bloquea cuando hay una excepción en cualquiera de los hilos

fragmento de código: Mensaje

cp = ConfigParser.ConfigParser() 
cp.read(gdbini) 
for table in cp.sections(): 
    jobs.append(table) 
#print jobs 
poolreturn = pool.map(worker, jobs) 
pool.close() 
pool.join() 

Fallo:


Traceback (most recent call last): 
    File "/opt/cnet-python/default-2.6/lib/python2.6/threading.py", line 525, in __bootstrap_inner 
    self.run() 
    File "/opt/cnet-python/default-2.6/lib/python2.6/threading.py", line 477, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "/opt/cnet-python/default-2.6/lib/python2.6/multiprocessing/pool.py", line 259, in _handle_results 
    task = get() 
TypeError: ('__init__() takes exactly 3 arguments (2 given)', <class 'ConfigParser.NoOptionError'>, ("No option 'inputfilename' in section: 'section-1'",)) 

I se adelantó a agregar un controlador de excepción para finalizar el proceso

try: 
    ifile=cp.get(table,'inputfilename') 
except ConfigParser.NoSectionError,ConfigParser.NoOptionError: 
    usage("One of Parameter not found for"+ table) 
    terminate() 

pero todavía espera, no estoy seguro de qué es lo que falta.

+0

Parece que ConfigParser tiene el mismo problema que SQLAlchemy (excepciones no seleccionables), vea [Script de bloqueo en Python usando SQLAlchemy y multiprocesamiento] (http://stackoverflow.com/questions/8785899/hang-in-python-script -using-sqlalchemy-y-multiprocesamiento). He informado sobre este problema ya que [las excepciones de ConfigParser no son seleccionables] (http://bugs.python.org/issue13760). –

Respuesta

0

Tuve el mismo problema. Sucede cuando un proceso de trabajo genera una excepción de usuario que tiene un constructor personalizado. Asegúrese de que su excepción (ConfigParser.NoOptionError en ese caso) inicializa la base con excepción exactamente dos argumentos:

class NoOptionError(ValueError): 

    def __init__(self, message, *args): 
     super(NoOptionError, self).__init__(message, args) 
+1

Esta excepción proviene de un módulo de Python (ConfigParser) y debe corregirse allí. –

2

En Python 3.2+ esto funciona como se esperaba. Para Python 2, este error se corrigió en r74545 y estará disponible en Python 2.7.3. Mientras tanto, puede usar la biblioteca configparser, que es un respaldo del configurador de configuración de 3.2+. Check it out.

+0

¿Era esto una gran cosa en el configparser o multiproceso? (Recibo el mismo error con multiprocesamiento, no relacionado con configparser) – user48956

Cuestiones relacionadas