diff options
author | Xiang Zhang <angwerzx@126.com> | 2017-05-17 14:03:35 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-17 14:03:35 (GMT) |
commit | 43d4c0329e2348540a3a16ac61b3032f04eefd34 (patch) | |
tree | e627eacc7a4d2678e9a248d6c506009b9cabc010 | |
parent | b769c91c2db304db44cd514344369cde1f8d9dc5 (diff) | |
download | cpython-43d4c0329e2348540a3a16ac61b3032f04eefd34.zip cpython-43d4c0329e2348540a3a16ac61b3032f04eefd34.tar.gz cpython-43d4c0329e2348540a3a16ac61b3032f04eefd34.tar.bz2 |
bpo-30301: Fix AttributeError when using SimpleQueue.empty() (#1601) (#1628)
Under *spawn* and *forkserver* start methods, SimpleQueue.empty() could
raise AttributeError due to not setting _poll in __setstate__.
-rw-r--r-- | Lib/multiprocessing/queues.py | 1 | ||||
-rw-r--r-- | Lib/test/_test_multiprocessing.py | 36 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
3 files changed, 40 insertions, 0 deletions
diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index dda03dd..a4f4ef8 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -337,6 +337,7 @@ class SimpleQueue(object): def __setstate__(self, state): (self._reader, self._writer, self._rlock, self._wlock) = state + self._poll = self._reader.poll def get(self): with self._rlock: diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 57ada12..3eb83c5 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -3958,6 +3958,42 @@ class TestSemaphoreTracker(unittest.TestCase): self.assertRegex(err, expected) self.assertRegex(err, r'semaphore_tracker: %r: \[Errno' % name1) +class TestSimpleQueue(unittest.TestCase): + + @classmethod + def _test_empty(cls, queue, child_can_start, parent_can_continue): + child_can_start.wait() + # issue 30301, could fail under spawn and forkserver + try: + queue.put(queue.empty()) + queue.put(queue.empty()) + finally: + parent_can_continue.set() + + def test_empty(self): + queue = multiprocessing.SimpleQueue() + child_can_start = multiprocessing.Event() + parent_can_continue = multiprocessing.Event() + + proc = multiprocessing.Process( + target=self._test_empty, + args=(queue, child_can_start, parent_can_continue) + ) + proc.daemon = True + proc.start() + + self.assertTrue(queue.empty()) + + child_can_start.set() + parent_can_continue.wait() + + self.assertFalse(queue.empty()) + self.assertEqual(queue.get(), True) + self.assertEqual(queue.get(), False) + self.assertTrue(queue.empty()) + + proc.join() + # # Mixins # @@ -36,6 +36,9 @@ Core and Builtins Library ------- +- bpo-30301: Fix AttributeError when using SimpleQueue.empty() under + *spawn* and *forkserver* start methods. + - bpo-30329: imaplib and poplib now catch the Windows socket WSAEINVAL error (code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted. This error occurs sometimes on SSL connections. |