mirror of
https://github.com/python/cpython.git
synced 2025-12-15 21:44:50 +00:00
gh-132106: Ensure that running logging.handlers.QueueListener cannot be started again (GH-132444)
Prevents a thread leak Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
This commit is contained in:
parent
64b066ad29
commit
5863cd70b8
5 changed files with 24 additions and 0 deletions
|
|
@ -1186,6 +1186,10 @@ possible, while any potentially slow operations (such as sending an email via
|
|||
This starts up a background thread to monitor the queue for
|
||||
LogRecords to process.
|
||||
|
||||
.. versionchanged:: next
|
||||
Raises :exc:`RuntimeError` if called and the listener is already
|
||||
running.
|
||||
|
||||
.. method:: stop()
|
||||
|
||||
Stops the listener.
|
||||
|
|
|
|||
|
|
@ -819,6 +819,10 @@ logging.handlers
|
|||
manager protocol, allowing it to be used in a :keyword:`with` statement.
|
||||
(Contributed by Charles Machalow in :gh:`132106`.)
|
||||
|
||||
* :meth:`QueueListener.start <logging.handlers.QueueListener.start>` now
|
||||
raises a :exc:`RuntimeError` if the listener is already started.
|
||||
(Contributed by Charles Machalow in :gh:`132106`.)
|
||||
|
||||
|
||||
mimetypes
|
||||
---------
|
||||
|
|
|
|||
|
|
@ -1561,6 +1561,9 @@ class QueueListener(object):
|
|||
This starts up a background thread to monitor the queue for
|
||||
LogRecords to process.
|
||||
"""
|
||||
if self._thread is not None:
|
||||
raise RuntimeError("Listener already started")
|
||||
|
||||
self._thread = t = threading.Thread(target=self._monitor)
|
||||
t.daemon = True
|
||||
t.start()
|
||||
|
|
|
|||
|
|
@ -4356,6 +4356,17 @@ class QueueHandlerTest(BaseTest):
|
|||
listener.stop()
|
||||
self.assertIsNone(listener._thread)
|
||||
|
||||
def test_queue_listener_multi_start(self):
|
||||
handler = TestHandler(support.Matcher())
|
||||
with logging.handlers.QueueListener(self.queue, handler) as listener:
|
||||
self.assertRaises(RuntimeError, listener.start)
|
||||
|
||||
with listener:
|
||||
self.assertRaises(RuntimeError, listener.start)
|
||||
|
||||
listener.start()
|
||||
listener.stop()
|
||||
|
||||
def test_queue_listener_with_StreamHandler(self):
|
||||
# Test that traceback and stack-info only appends once (bpo-34334, bpo-46755).
|
||||
listener = logging.handlers.QueueListener(self.queue, self.root_hdlr)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
:meth:`QueueListener.start <logging.handlers.QueueListener.start>` now
|
||||
raises a :exc:`RuntimeError` if the listener is already started.
|
||||
Loading…
Add table
Add a link
Reference in a new issue