mirror of https://github.com/python/cpython
bpo-30966: Add multiprocessing.SimpleQueue.close() (GH-19735)
Add a new close() method to multiprocessing.SimpleQueue to explicitly close the queue. Automerge-Triggered-By: @pitrou
This commit is contained in:
parent
c5c42815ec
commit
9adccc1384
|
@ -878,6 +878,16 @@ For an example of the usage of queues for interprocess communication see
|
|||
|
||||
It is a simplified :class:`Queue` type, very close to a locked :class:`Pipe`.
|
||||
|
||||
.. method:: close()
|
||||
|
||||
Close the queue: release internal resources.
|
||||
|
||||
A queue must not be used anymore after it is closed. For example,
|
||||
:meth:`get`, :meth:`put` and :meth:`empty` methods must no longer be
|
||||
called.
|
||||
|
||||
.. versionadded:: 3.9
|
||||
|
||||
.. method:: empty()
|
||||
|
||||
Return ``True`` if the queue is empty, ``False`` otherwise.
|
||||
|
|
|
@ -376,6 +376,14 @@ nntplib
|
|||
if the given timeout for their constructor is zero to prevent the creation of
|
||||
a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.)
|
||||
|
||||
multiprocessing
|
||||
---------------
|
||||
|
||||
The :class:`multiprocessing.SimpleQueue` class has a new
|
||||
:meth:`~multiprocessing.SimpleQueue.close` method to explicitly close the
|
||||
queue.
|
||||
(Contributed by Victor Stinner in :issue:`30966`.)
|
||||
|
||||
os
|
||||
--
|
||||
|
||||
|
|
|
@ -346,6 +346,10 @@ class SimpleQueue(object):
|
|||
else:
|
||||
self._wlock = ctx.Lock()
|
||||
|
||||
def close(self):
|
||||
self._reader.close()
|
||||
self._writer.close()
|
||||
|
||||
def empty(self):
|
||||
return not self._poll()
|
||||
|
||||
|
|
|
@ -5244,6 +5244,20 @@ class TestSimpleQueue(unittest.TestCase):
|
|||
|
||||
proc.join()
|
||||
|
||||
def test_close(self):
|
||||
queue = multiprocessing.SimpleQueue()
|
||||
queue.close()
|
||||
# closing a queue twice should not fail
|
||||
queue.close()
|
||||
|
||||
# Test specific to CPython since it tests private attributes
|
||||
@test.support.cpython_only
|
||||
def test_closed(self):
|
||||
queue = multiprocessing.SimpleQueue()
|
||||
queue.close()
|
||||
self.assertTrue(queue._reader.closed)
|
||||
self.assertTrue(queue._writer.closed)
|
||||
|
||||
|
||||
class TestPoolNotLeakOnFailure(unittest.TestCase):
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Add a new :meth:`~multiprocessing.SimpleQueue.close` method to the
|
||||
:class:`~multiprocessing.SimpleQueue` class to explicitly close the queue.
|
Loading…
Reference in New Issue