diff options
author | Ross Lagerwall <rosslagerwall@gmail.com> | 2012-01-08 06:29:40 (GMT) |
---|---|---|
committer | Ross Lagerwall <rosslagerwall@gmail.com> | 2012-01-08 06:29:40 (GMT) |
commit | 66e2fb68aca2a2678a327b200e657b761f358bc1 (patch) | |
tree | f5037c0da90ca27dd2977d30fb8fb29ae8394431 | |
parent | 645a0dd6f79004652c52ae9d7246d1b219772588 (diff) | |
download | cpython-66e2fb68aca2a2678a327b200e657b761f358bc1.zip cpython-66e2fb68aca2a2678a327b200e657b761f358bc1.tar.gz cpython-66e2fb68aca2a2678a327b200e657b761f358bc1.tar.bz2 |
Issue #12364: Fix a hang in concurrent.futures.ProcessPoolExecutor.
-rw-r--r-- | Lib/concurrent/futures/process.py | 7 | ||||
-rw-r--r-- | Lib/test/test_concurrent_futures.py | 6 | ||||
-rw-r--r-- | 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 8082940..d3bbe2c 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 6cc57f8..372da27 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): @@ -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. |