From b713adf27a76b5df95e3ee5f85f9064a2763ae35 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 2 Sep 2017 00:25:11 +0200 Subject: [PATCH] bpo-31326: ProcessPoolExecutor waits for the call queue thread (#3265) * bpo-31326: ProcessPoolExecutor waits for the call queue thread concurrent.futures.ProcessPoolExecutor.shutdown() now explicitly closes the call queue. Moreover, shutdown(wait=True) now also join the call queue thread, to prevent leaking a dangling thread. * Fix for shutdown() being called twice. --- Lib/concurrent/futures/process.py | 6 +++++- .../next/Library/2017-09-01-18-48-06.bpo-31326.TB05tV.rst | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2017-09-01-18-48-06.bpo-31326.TB05tV.rst diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index 03b28ab5d6..50ee296ac8 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -507,7 +507,11 @@ class ProcessPoolExecutor(_base.Executor): # To reduce the risk of opening too many files, remove references to # objects that use file descriptors. self._queue_management_thread = None - self._call_queue = None + if self._call_queue is not None: + self._call_queue.close() + if wait: + self._call_queue.join_thread() + self._call_queue = None self._result_queue = None self._processes = None shutdown.__doc__ = _base.Executor.shutdown.__doc__ diff --git a/Misc/NEWS.d/next/Library/2017-09-01-18-48-06.bpo-31326.TB05tV.rst b/Misc/NEWS.d/next/Library/2017-09-01-18-48-06.bpo-31326.TB05tV.rst new file mode 100644 index 0000000000..ea0ff2b458 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-09-01-18-48-06.bpo-31326.TB05tV.rst @@ -0,0 +1,3 @@ +concurrent.futures.ProcessPoolExecutor.shutdown() now explicitly closes the +call queue. Moreover, shutdown(wait=True) now also join the call queue +thread, to prevent leaking a dangling thread. -- 2.40.0