Kaydet (Commit) 43d4c032 authored tarafından Xiang Zhang's avatar Xiang Zhang Kaydeden (comit) GitHub

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__.
üst b769c91c
...@@ -337,6 +337,7 @@ class SimpleQueue(object): ...@@ -337,6 +337,7 @@ class SimpleQueue(object):
def __setstate__(self, state): def __setstate__(self, state):
(self._reader, self._writer, self._rlock, self._wlock) = state (self._reader, self._writer, self._rlock, self._wlock) = state
self._poll = self._reader.poll
def get(self): def get(self):
with self._rlock: with self._rlock:
......
...@@ -3958,6 +3958,42 @@ class TestSemaphoreTracker(unittest.TestCase): ...@@ -3958,6 +3958,42 @@ class TestSemaphoreTracker(unittest.TestCase):
self.assertRegex(err, expected) self.assertRegex(err, expected)
self.assertRegex(err, r'semaphore_tracker: %r: \[Errno' % name1) 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 # Mixins
# #
......
...@@ -36,6 +36,9 @@ Core and Builtins ...@@ -36,6 +36,9 @@ Core and Builtins
Library 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 - bpo-30329: imaplib and poplib now catch the Windows socket WSAEINVAL error
(code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted. (code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted.
This error occurs sometimes on SSL connections. This error occurs sometimes on SSL connections.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment