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

Initial patch by mouad
This commit is contained in:
Richard Oudkerk 2012-06-06 19:04:57 +01:00
parent a3a164a03c
commit e41682b994
3 changed files with 19 additions and 3 deletions

View File

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

View File

@ -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):
'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):
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):
'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')

View File

@ -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