]> granicus.if.org Git - python/commitdiff
bpo-30886: Fix multiprocessing.Queue.join_thread() (#2642)
authorVictor Stinner <victor.stinner@gmail.com>
Mon, 10 Jul 2017 10:45:21 +0000 (12:45 +0200)
committerGitHub <noreply@github.com>
Mon, 10 Jul 2017 10:45:21 +0000 (12:45 +0200)
multiprocessing.Queue.join_thread() now waits until the thread
completes, even if the thread was started by the same process which
created the queue.

Fix the following warning which occurs randomly when running
test_handle_called_with_mp_queue of test_logging.QueueListenerTest:

Warning -- threading_cleanup() failed to cleanup -1 threads after 4 sec (count: 0, dangling: 1)

Lib/multiprocessing/queues.py
Misc/NEWS.d/next/Library/2017-07-10-12-14-22.bpo-30886.nqQj34.rst [new file with mode: 0644]

index 90844fed158c6d0ee5e12e486b0d727a6876ffb9..513807cafecb6dd2e19ec347ef210e9a2c109367 100644 (file)
@@ -169,14 +169,7 @@ class Queue(object):
         self._thread.start()
         debug('... done self._thread.start()')
 
-        # On process exit we will wait for data to be flushed to pipe.
-        #
-        # However, if this process created the queue then all
-        # processes which use the queue will be descendants of this
-        # process.  Therefore waiting for the queue to be flushed
-        # is pointless once all the child processes have been joined.
-        created_by_this_process = (self._opid == os.getpid())
-        if not self._joincancelled and not created_by_this_process:
+        if not self._joincancelled:
             self._jointhread = Finalize(
                 self._thread, Queue._finalize_join,
                 [weakref.ref(self._thread)],
diff --git a/Misc/NEWS.d/next/Library/2017-07-10-12-14-22.bpo-30886.nqQj34.rst b/Misc/NEWS.d/next/Library/2017-07-10-12-14-22.bpo-30886.nqQj34.rst
new file mode 100644 (file)
index 0000000..fedd6cd
--- /dev/null
@@ -0,0 +1,3 @@
+Fix multiprocessing.Queue.join_thread(): it now waits until the thread
+completes, even if the thread was started by the same process which created
+the queue.