mirror of
https://github.com/python/cpython.git
synced 2025-10-06 23:21:06 +00:00
Issue #23051: multiprocessing.Pool methods imap() and imap_unordered() now
handle exceptions raised by an iterator. Patch by Alon Diamant and Davin Potts.
This commit is contained in:
commit
63623ac252
4 changed files with 75 additions and 14 deletions
|
@ -374,25 +374,34 @@ class Pool(object):
|
|||
thread = threading.current_thread()
|
||||
|
||||
for taskseq, set_length in iter(taskqueue.get, None):
|
||||
task = None
|
||||
i = -1
|
||||
for i, task in enumerate(taskseq):
|
||||
if thread._state:
|
||||
util.debug('task handler found thread._state != RUN')
|
||||
break
|
||||
try:
|
||||
put(task)
|
||||
except Exception as e:
|
||||
job, ind = task[:2]
|
||||
try:
|
||||
for i, task in enumerate(taskseq):
|
||||
if thread._state:
|
||||
util.debug('task handler found thread._state != RUN')
|
||||
break
|
||||
try:
|
||||
cache[job]._set(ind, (False, e))
|
||||
except KeyError:
|
||||
pass
|
||||
else:
|
||||
put(task)
|
||||
except Exception as e:
|
||||
job, ind = task[:2]
|
||||
try:
|
||||
cache[job]._set(ind, (False, e))
|
||||
except KeyError:
|
||||
pass
|
||||
else:
|
||||
if set_length:
|
||||
util.debug('doing set_length()')
|
||||
set_length(i+1)
|
||||
continue
|
||||
break
|
||||
except Exception as ex:
|
||||
job, ind = task[:2] if task else (0, 0)
|
||||
if job in cache:
|
||||
cache[job]._set(ind + 1, (False, ex))
|
||||
if set_length:
|
||||
util.debug('doing set_length()')
|
||||
set_length(i+1)
|
||||
continue
|
||||
break
|
||||
else:
|
||||
util.debug('task handler got sentinel')
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue