From 66e2fb68aca2a2678a327b200e657b761f358bc1 Mon Sep 17 00:00:00 2001 From: Ross Lagerwall Date: Sun, 8 Jan 2012 08:29:40 +0200 Subject: [PATCH] Issue #12364: Fix a hang in concurrent.futures.ProcessPoolExecutor. --- Lib/concurrent/futures/process.py | 7 +------ Lib/test/test_concurrent_futures.py | 6 ++++++ Misc/NEWS | 4 ++++ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 80829406774..d3bbe2c5e68 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -213,9 +213,7 @@ def _queue_management_worker(executor_reference, work_item.future.set_exception(result_item.exception) else: work_item.future.set_result(result_item.result) - continue - # If we come here, we either got a timeout or were explicitly woken up. - # In either case, check whether we should start shutting down. + # Check whether we should start shutting down. executor = executor_reference() # No more work items can be added if: # - The interpreter is shutting down OR @@ -234,9 +232,6 @@ def _queue_management_worker(executor_reference, p.join() call_queue.close() return - else: - # Start shutting down by telling a process it can exit. - shutdown_one_process() del executor _system_limits_checked = False diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py index 6cc57f85d0b..372da27dca3 100644 --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -109,6 +109,12 @@ class ExecutorShutdownTest(unittest.TestCase): self.assertFalse(err) self.assertEqual(out.strip(), b"apple") + def test_hang_issue12364(self): + fs = [self.executor.submit(time.sleep, 0.1) for _ in range(50)] + self.executor.shutdown() + for f in fs: + f.result() + class ThreadPoolShutdownTest(ThreadPoolMixin, ExecutorShutdownTest): def _prime_executor(self): diff --git a/Misc/NEWS b/Misc/NEWS index 9212f9e6229..8e95abb6183 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -97,6 +97,10 @@ Core and Builtins Library ------- +- Issue #12364: Fix a hang in concurrent.futures.ProcessPoolExecutor. + The hang would occur when retrieving the result of a scheduled future after + the executor had been shut down. + - Issue #13502: threading: Fix a race condition in Event.wait() that made it return False when the event was set and cleared right after.