Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 33aaa73

Browse files
committed
Merge.
2 parents e6514f5 + e90cedb commit 33aaa73

2 files changed

Lines changed: 19 additions & 5 deletions

File tree

Lib/multiprocessing/pool.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ def __init__(self, processes=None, initializer=None, initargs=(),
174174

175175
self._task_handler = threading.Thread(
176176
target=Pool._handle_tasks,
177-
args=(self._taskqueue, self._quick_put, self._outqueue, self._pool)
177+
args=(self._taskqueue, self._quick_put, self._outqueue,
178+
self._pool, self._cache)
178179
)
179180
self._task_handler.daemon = True
180181
self._task_handler._state = RUN
@@ -364,7 +365,7 @@ def _handle_workers(pool):
364365
util.debug('worker handler exiting')
365366

366367
@staticmethod
367-
def _handle_tasks(taskqueue, put, outqueue, pool):
368+
def _handle_tasks(taskqueue, put, outqueue, pool, cache):
368369
thread = threading.current_thread()
369370

370371
for taskseq, set_length in iter(taskqueue.get, None):
@@ -375,9 +376,12 @@ def _handle_tasks(taskqueue, put, outqueue, pool):
375376
break
376377
try:
377378
put(task)
378-
except OSError:
379-
util.debug('could not put task on queue')
380-
break
379+
except Exception as e:
380+
job, ind = task[:2]
381+
try:
382+
cache[job]._set(ind, (False, e))
383+
except KeyError:
384+
pass
381385
else:
382386
if set_length:
383387
util.debug('doing set_length()')

Lib/test/_test_multiprocessing.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1698,6 +1698,16 @@ def test_map_async_callbacks(self):
16981698
self.assertEqual(2, len(call_args))
16991699
self.assertIsInstance(call_args[1], ValueError)
17001700

1701+
def test_map_unplicklable(self):
1702+
# Issue #19425 -- failure to pickle should not cause a hang
1703+
if self.TYPE == 'threads':
1704+
return
1705+
class A(object):
1706+
def __reduce__(self):
1707+
raise RuntimeError('cannot pickle')
1708+
with self.assertRaises(RuntimeError):
1709+
self.pool.map(sqr, [A()]*10)
1710+
17011711
def test_map_chunksize(self):
17021712
try:
17031713
self.pool.map_async(sqr, [], chunksize=1).get(timeout=TIMEOUT1)

0 commit comments

Comments
 (0)