2010-02-11 9 views
6

Sono nuovo di Python e cercando un programma multiprocessing.pool per elaborare i file, funziona bene finché non ci sono eccezioni. Se uno qualsiasi di thread/processo ottiene un'eccezione l'intero programma attende il filoPool multiprocessing si blocca quando c'è un'eccezione in qualsiasi del filo

frammento di codice:

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() 

Fallimento Messaggio:


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 è andato avanti ha aggiunto un gestore di eccezioni per terminare il processo

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

ma ancora aspetta, non è sicuro che cosa manca.

+0

Sembra ConfigParser ha lo stesso problema come SQLAlchemy (eccezioni non pickleable), vedi [Hang nello script Python utilizzando SQLAlchemy e multiprocessing] (http://stackoverflow.com/questions/8785899/hang-in-python-script -utilizzando-SQLAlchemy-e-multiprocessing). Ho segnalato questo problema poiché [Eccezioni di ConfigParser non sono selezionabili] (http://bugs.python.org/issue13760). –

risposta

0

Ho avuto lo stesso problema. Succede quando un processo di lavoro solleva un'eccezione utente che ha un costruttore personalizzato. Assicurati che il tuo eccezione (ConfigParser.NoOptionError in quel caso) inizializza l'eccezione base con esattamente due argomenti:

class NoOptionError(ValueError): 

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

Questa eccezione proviene da un modulo Python (ConfigParser) e deve essere riparata lì. –

2

In Python 3.2+ questo funziona come previsto. Per Python 2, questo bug è stato corretto in r74545 e sarà disponibile in Python 2.7.3. Nel frattempo, è possibile utilizzare la libreria configparser che è un backport del configparser dalla versione 3.2 o successiva. Check it out.

+0

Questo è un grande configparser o multiprocesso? (Sto ricevendo lo stesso errore con multiprocesso, non correlato a configparser) – user48956