consideri il file sample.py
contiene il codice seguente:imap_unordered() riaggancia se iterable genera un errore
from multiprocessing import Pool
def sample_worker(x):
print "sample_worker processes item", x
return x
def get_sample_sequence():
for i in xrange(2,30):
if i % 10 == 0:
raise Exception('That sequence is corrupted!')
yield i
if __name__ == "__main__":
pool = Pool(24)
try:
for x in pool.imap_unordered(sample_worker, get_sample_sequence()):
print "sample_worker returned value", x
except:
print "Outer exception caught!"
pool.close()
pool.join()
print "done"
Quando eseguire esso, ottengo il seguente output:
Exception in thread Thread-2:
Traceback (most recent call last):
File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
self.run()
File "C:\Python27\lib\threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "C:\Python27\lib\multiprocessing\pool.py", line 338, in _handle_tasks
for i, task in enumerate(taskseq):
File "C:\Python27\lib\multiprocessing\pool.py", line 278, in <genexpr>
self._taskqueue.put((((result._job, i, func, (x,), {})
File "C:\Users\renat-nasyrov\Desktop\sample.py", line 10, in get_sample_sequence
raise Exception('That sequence is corrupted!')
Exception: That sequence is corrupted!
Dopo di che, l'applicazione riaggancia. Come posso gestire la situazione senza rotture?
Il tuo rientro è sbagliato ... – tamasgal
@septi: corretto, grazie. – Pehat
Ho passato il codice con il debugger e ha funzionato come previsto. Tuttavia, quando lo eseguo, ottengo il comportamento che descrivi. Quindi forse c'è un problema di concorrenza in imap_unordered? – phobic