From 233e6988f4b439f160732dd5b55e9d1a06a64b47 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 6 Mar 2015 22:17:25 +0200 Subject: Issue #22853: Fixed a deadlock when use multiprocessing.Queue at import time. Patch by Florian Finkernagel and Davin Potts. --- Lib/multiprocessing/queues.py | 10 ++++------ Lib/test/test_multiprocessing.py | 20 ++++++++++++++++++++ Misc/ACKS | 2 ++ Misc/NEWS | 3 +++ 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index 433c7e2..487e0af 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -44,10 +44,10 @@ import weakref from Queue import Empty, Full import _multiprocessing -from multiprocessing import Pipe -from multiprocessing.synchronize import Lock, BoundedSemaphore, Semaphore, Condition -from multiprocessing.util import debug, info, Finalize, register_after_fork -from multiprocessing.forking import assert_spawning +from . import Pipe +from .synchronize import Lock, BoundedSemaphore, Semaphore, Condition +from .util import debug, info, Finalize, register_after_fork, is_exiting +from .forking import assert_spawning # # Queue type using a pipe, buffer and thread @@ -229,8 +229,6 @@ class Queue(object): @staticmethod def _feed(buffer, notempty, send, writelock, close): debug('starting thread to feed data to pipe') - from .util import is_exiting - nacquire = notempty.acquire nrelease = notempty.release nwait = notempty.wait diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py index ec4507e..b1e75b5 100644 --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -620,6 +620,26 @@ class _TestQueue(BaseTestCase): for p in workers: p.join() + def test_no_import_lock_contention(self): + with test_support.temp_cwd(): + module_name = 'imported_by_an_imported_module' + with open(module_name + '.py', 'w') as f: + f.write("""if 1: + import multiprocessing + + q = multiprocessing.Queue() + q.put('knock knock') + q.get(timeout=3) + q.close() + """) + + with test_support.DirsOnSysPath(os.getcwd()): + try: + __import__(module_name) + except Queue.Empty: + self.fail("Probable regression on import lock contention;" + " see Issue #22853") + # # # diff --git a/Misc/ACKS b/Misc/ACKS index f03f34e..e91e2a4 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -411,6 +411,7 @@ Vincent Fiack Anastasia Filatova Tomer Filiba Jeffrey Finkelstein +Florian Finkernagel Russell Finn Dan Finnie Nils Fischbeck @@ -1073,6 +1074,7 @@ Martin Pool Iustin Pop Claudiu Popa John Popplewell +Davin Potts Guillaume Pratte Amrit Prem Paul Prescod diff --git a/Misc/NEWS b/Misc/NEWS index e24d40c..a1ff5aa 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -18,6 +18,9 @@ Core and Builtins Library ------- +- Issue #22853: Fixed a deadlock when use multiprocessing.Queue at import time. + Patch by Florian Finkernagel and Davin Potts. + - Issue #23476: In the ssl module, enable OpenSSL's X509_V_FLAG_TRUSTED_FIRST flag on certificate stores when it is available. -- cgit v0.12