summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2017-09-01 22:25:11 (GMT)
committerGitHub <noreply@github.com>2017-09-01 22:25:11 (GMT)
commitb713adf27a76b5df95e3ee5f85f9064a2763ae35 (patch)
treebac3811accd903d51a7346fb15dad045d7a64ecc
parent97e1b1c81458d2109b2ffed32ffa1eb643a6c3b9 (diff)
downloadcpython-b713adf27a76b5df95e3ee5f85f9064a2763ae35.zip
cpython-b713adf27a76b5df95e3ee5f85f9064a2763ae35.tar.gz
cpython-b713adf27a76b5df95e3ee5f85f9064a2763ae35.tar.bz2
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.
-rw-r--r--Lib/concurrent/futures/process.py6
-rw-r--r--Misc/NEWS.d/next/Library/2017-09-01-18-48-06.bpo-31326.TB05tV.rst3
2 files changed, 8 insertions, 1 deletions
diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py
index 03b28ab..50ee296 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 0000000..ea0ff2b
--- /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.