mirror of
https://github.com/python/cpython.git
synced 2025-10-01 21:02:15 +00:00
Under *spawn* and *forkserver* start methods, SimpleQueue.empty() could raise AttributeError due to not setting _poll in __setstate__.
This commit is contained in:
parent
b769c91c2d
commit
43d4c0329e
3 changed files with 40 additions and 0 deletions
|
@ -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):
|
||||||
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
|
||||||
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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue