Commit 54837546 authored by Richard Oudkerk's avatar Richard Oudkerk

Issue #12157: pool.map() does not handle empty iterable correctly

Initial patch by mouad
parent bebc12fe
...@@ -584,6 +584,7 @@ class MapResult(ApplyResult): ...@@ -584,6 +584,7 @@ class MapResult(ApplyResult):
if chunksize <= 0: if chunksize <= 0:
self._number_left = 0 self._number_left = 0
self._ready = True self._ready = True
del cache[self._job]
else: else:
self._number_left = length//chunksize + bool(length % chunksize) self._number_left = length//chunksize + bool(length % chunksize)
......
...@@ -1178,6 +1178,18 @@ class _TestPool(BaseTestCase): ...@@ -1178,6 +1178,18 @@ class _TestPool(BaseTestCase):
join() join()
self.assertLess(join.elapsed, 0.5) self.assertLess(join.elapsed, 0.5)
def test_empty_iterable(self):
# See Issue 12157
p = self.Pool(1)
self.assertEqual(p.map(sqr, []), [])
self.assertEqual(list(p.imap(sqr, [])), [])
self.assertEqual(list(p.imap_unordered(sqr, [])), [])
self.assertEqual(p.map_async(sqr, []).get(), [])
p.close()
p.join()
def raising(): def raising():
raise KeyError("key") raise KeyError("key")
...@@ -2176,7 +2188,7 @@ class ProcessesMixin(object): ...@@ -2176,7 +2188,7 @@ class ProcessesMixin(object):
'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
'Condition', 'Event', 'Value', 'Array', 'RawValue', 'Condition', 'Event', 'Value', 'Array', 'RawValue',
'RawArray', 'current_process', 'active_children', 'Pipe', 'RawArray', 'current_process', 'active_children', 'Pipe',
'connection', 'JoinableQueue' 'connection', 'JoinableQueue', 'Pool'
))) )))
testcases_processes = create_test_cases(ProcessesMixin, type='processes') testcases_processes = create_test_cases(ProcessesMixin, type='processes')
...@@ -2190,7 +2202,7 @@ class ManagerMixin(object): ...@@ -2190,7 +2202,7 @@ class ManagerMixin(object):
locals().update(get_attributes(manager, ( locals().update(get_attributes(manager, (
'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
'Condition', 'Event', 'Value', 'Array', 'list', 'dict', 'Condition', 'Event', 'Value', 'Array', 'list', 'dict',
'Namespace', 'JoinableQueue' 'Namespace', 'JoinableQueue', 'Pool'
))) )))
testcases_manager = create_test_cases(ManagerMixin, type='manager') testcases_manager = create_test_cases(ManagerMixin, type='manager')
...@@ -2204,7 +2216,7 @@ class ThreadsMixin(object): ...@@ -2204,7 +2216,7 @@ class ThreadsMixin(object):
'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Queue', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore',
'Condition', 'Event', 'Value', 'Array', 'current_process', 'Condition', 'Event', 'Value', 'Array', 'current_process',
'active_children', 'Pipe', 'connection', 'dict', 'list', 'active_children', 'Pipe', 'connection', 'dict', 'list',
'Namespace', 'JoinableQueue' 'Namespace', 'JoinableQueue', 'Pool'
))) )))
testcases_threads = create_test_cases(ThreadsMixin, type='threads') testcases_threads = create_test_cases(ThreadsMixin, type='threads')
......
...@@ -70,6 +70,9 @@ Core and Builtins ...@@ -70,6 +70,9 @@ Core and Builtins
Library Library
------- -------
- Issue #12157: Make pool.map() empty iterables correctly. Initial
patch by mouad.
- Issue #14992: os.makedirs(path, exist_ok=True) would raise an OSError - Issue #14992: os.makedirs(path, exist_ok=True) would raise an OSError
when the path existed and had the S_ISGID mode bit set when it was when the path existed and had the S_ISGID mode bit set when it was
not explicitly asked for. This is no longer an exception as mkdir not explicitly asked for. This is no longer an exception as mkdir
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment