mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 03:22:27 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			280 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			280 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
:mod:`queue` --- A synchronized queue class
 | 
						|
===========================================
 | 
						|
 | 
						|
.. module:: queue
 | 
						|
   :synopsis: A synchronized queue class.
 | 
						|
 | 
						|
**Source code:** :source:`Lib/queue.py`
 | 
						|
 | 
						|
--------------
 | 
						|
 | 
						|
The :mod:`queue` module implements multi-producer, multi-consumer queues.
 | 
						|
It is especially useful in threaded programming when information must be
 | 
						|
exchanged safely between multiple threads.  The :class:`Queue` class in this
 | 
						|
module implements all the required locking semantics.
 | 
						|
 | 
						|
The module implements three types of queue, which differ only in the order in
 | 
						|
which the entries are retrieved.  In a :abbr:`FIFO (first-in, first-out)`
 | 
						|
queue, the first tasks added are the first retrieved.  In a
 | 
						|
:abbr:`LIFO (last-in, first-out)` queue, the most recently added entry is
 | 
						|
the first retrieved (operating like a stack).  With a priority queue,
 | 
						|
the entries are kept sorted (using the :mod:`heapq` module) and the
 | 
						|
lowest valued entry is retrieved first.
 | 
						|
 | 
						|
Internally, those three types of queues use locks to temporarily block
 | 
						|
competing threads; however, they are not designed to handle reentrancy
 | 
						|
within a thread.
 | 
						|
 | 
						|
In addition, the module implements a "simple"
 | 
						|
:abbr:`FIFO (first-in, first-out)` queue type, :class:`SimpleQueue`, whose
 | 
						|
specific implementation provides additional guarantees
 | 
						|
in exchange for the smaller functionality.
 | 
						|
 | 
						|
The :mod:`queue` module defines the following classes and exceptions:
 | 
						|
 | 
						|
.. class:: Queue(maxsize=0)
 | 
						|
 | 
						|
   Constructor for a :abbr:`FIFO (first-in, first-out)` queue.  *maxsize* is
 | 
						|
   an integer that sets the upperbound
 | 
						|
   limit on the number of items that can be placed in the queue.  Insertion will
 | 
						|
   block once this size has been reached, until queue items are consumed.  If
 | 
						|
   *maxsize* is less than or equal to zero, the queue size is infinite.
 | 
						|
 | 
						|
.. class:: LifoQueue(maxsize=0)
 | 
						|
 | 
						|
   Constructor for a :abbr:`LIFO (last-in, first-out)` queue.  *maxsize* is
 | 
						|
   an integer that sets the upperbound
 | 
						|
   limit on the number of items that can be placed in the queue.  Insertion will
 | 
						|
   block once this size has been reached, until queue items are consumed.  If
 | 
						|
   *maxsize* is less than or equal to zero, the queue size is infinite.
 | 
						|
 | 
						|
 | 
						|
.. class:: PriorityQueue(maxsize=0)
 | 
						|
 | 
						|
   Constructor for a priority queue.  *maxsize* is an integer that sets the upperbound
 | 
						|
   limit on the number of items that can be placed in the queue.  Insertion will
 | 
						|
   block once this size has been reached, until queue items are consumed.  If
 | 
						|
   *maxsize* is less than or equal to zero, the queue size is infinite.
 | 
						|
 | 
						|
   The lowest valued entries are retrieved first (the lowest valued entry is the
 | 
						|
   one that would be returned by ``min(entries)``).  A typical pattern for
 | 
						|
   entries is a tuple in the form: ``(priority_number, data)``.
 | 
						|
 | 
						|
   If the *data* elements are not comparable, the data can be wrapped in a class
 | 
						|
   that ignores the data item and only compares the priority number::
 | 
						|
 | 
						|
        from dataclasses import dataclass, field
 | 
						|
        from typing import Any
 | 
						|
 | 
						|
        @dataclass(order=True)
 | 
						|
        class PrioritizedItem:
 | 
						|
            priority: int
 | 
						|
            item: Any=field(compare=False)
 | 
						|
 | 
						|
.. class:: SimpleQueue()
 | 
						|
 | 
						|
   Constructor for an unbounded :abbr:`FIFO (first-in, first-out)` queue.
 | 
						|
   Simple queues lack advanced functionality such as task tracking.
 | 
						|
 | 
						|
   .. versionadded:: 3.7
 | 
						|
 | 
						|
 | 
						|
.. exception:: Empty
 | 
						|
 | 
						|
   Exception raised when non-blocking :meth:`~Queue.get` (or
 | 
						|
   :meth:`~Queue.get_nowait`) is called
 | 
						|
   on a :class:`Queue` object which is empty.
 | 
						|
 | 
						|
 | 
						|
.. exception:: Full
 | 
						|
 | 
						|
   Exception raised when non-blocking :meth:`~Queue.put` (or
 | 
						|
   :meth:`~Queue.put_nowait`) is called
 | 
						|
   on a :class:`Queue` object which is full.
 | 
						|
 | 
						|
 | 
						|
.. _queueobjects:
 | 
						|
 | 
						|
Queue Objects
 | 
						|
-------------
 | 
						|
 | 
						|
Queue objects (:class:`Queue`, :class:`LifoQueue`, or :class:`PriorityQueue`)
 | 
						|
provide the public methods described below.
 | 
						|
 | 
						|
 | 
						|
.. method:: Queue.qsize()
 | 
						|
 | 
						|
   Return the approximate size of the queue.  Note, qsize() > 0 doesn't
 | 
						|
   guarantee that a subsequent get() will not block, nor will qsize() < maxsize
 | 
						|
   guarantee that put() will not block.
 | 
						|
 | 
						|
 | 
						|
.. method:: Queue.empty()
 | 
						|
 | 
						|
   Return ``True`` if the queue is empty, ``False`` otherwise.  If empty()
 | 
						|
   returns ``True`` it doesn't guarantee that a subsequent call to put()
 | 
						|
   will not block.  Similarly, if empty() returns ``False`` it doesn't
 | 
						|
   guarantee that a subsequent call to get() will not block.
 | 
						|
 | 
						|
 | 
						|
.. method:: Queue.full()
 | 
						|
 | 
						|
   Return ``True`` if the queue is full, ``False`` otherwise.  If full()
 | 
						|
   returns ``True`` it doesn't guarantee that a subsequent call to get()
 | 
						|
   will not block.  Similarly, if full() returns ``False`` it doesn't
 | 
						|
   guarantee that a subsequent call to put() will not block.
 | 
						|
 | 
						|
 | 
						|
.. method:: Queue.put(item, block=True, timeout=None)
 | 
						|
 | 
						|
   Put *item* into the queue.  If optional args *block* is true and *timeout* is
 | 
						|
   ``None`` (the default), block if necessary until a free slot is available.  If
 | 
						|
   *timeout* is a positive number, it blocks at most *timeout* seconds and raises
 | 
						|
   the :exc:`Full` exception if no free slot was available within that time.
 | 
						|
   Otherwise (*block* is false), put an item on the queue if a free slot is
 | 
						|
   immediately available, else raise the :exc:`Full` exception (*timeout* is
 | 
						|
   ignored in that case).
 | 
						|
 | 
						|
 | 
						|
.. method:: Queue.put_nowait(item)
 | 
						|
 | 
						|
   Equivalent to ``put(item, block=False)``.
 | 
						|
 | 
						|
 | 
						|
.. method:: Queue.get(block=True, timeout=None)
 | 
						|
 | 
						|
   Remove and return an item from the queue.  If optional args *block* is true and
 | 
						|
   *timeout* is ``None`` (the default), block if necessary until an item is available.
 | 
						|
   If *timeout* is a positive number, it blocks at most *timeout* seconds and
 | 
						|
   raises the :exc:`Empty` exception if no item was available within that time.
 | 
						|
   Otherwise (*block* is false), return an item if one is immediately available,
 | 
						|
   else raise the :exc:`Empty` exception (*timeout* is ignored in that case).
 | 
						|
 | 
						|
   Prior to 3.0 on POSIX systems, and for all versions on Windows, if
 | 
						|
   *block* is true and *timeout* is ``None``, this operation goes into
 | 
						|
   an uninterruptible wait on an underlying lock.  This means that no exceptions
 | 
						|
   can occur, and in particular a SIGINT will not trigger a :exc:`KeyboardInterrupt`.
 | 
						|
 | 
						|
 | 
						|
.. method:: Queue.get_nowait()
 | 
						|
 | 
						|
   Equivalent to ``get(False)``.
 | 
						|
 | 
						|
Two methods are offered to support tracking whether enqueued tasks have been
 | 
						|
fully processed by daemon consumer threads.
 | 
						|
 | 
						|
 | 
						|
.. method:: Queue.task_done()
 | 
						|
 | 
						|
   Indicate that a formerly enqueued task is complete.  Used by queue consumer
 | 
						|
   threads.  For each :meth:`get` used to fetch a task, a subsequent call to
 | 
						|
   :meth:`task_done` tells the queue that the processing on the task is complete.
 | 
						|
 | 
						|
   If a :meth:`join` is currently blocking, it will resume when all items have been
 | 
						|
   processed (meaning that a :meth:`task_done` call was received for every item
 | 
						|
   that had been :meth:`put` into the queue).
 | 
						|
 | 
						|
   Raises a :exc:`ValueError` if called more times than there were items placed in
 | 
						|
   the queue.
 | 
						|
 | 
						|
 | 
						|
.. method:: Queue.join()
 | 
						|
 | 
						|
   Blocks until all items in the queue have been gotten and processed.
 | 
						|
 | 
						|
   The count of unfinished tasks goes up whenever an item is added to the queue.
 | 
						|
   The count goes down whenever a consumer thread calls :meth:`task_done` to
 | 
						|
   indicate that the item was retrieved and all work on it is complete.  When the
 | 
						|
   count of unfinished tasks drops to zero, :meth:`join` unblocks.
 | 
						|
 | 
						|
 | 
						|
Example of how to wait for enqueued tasks to be completed::
 | 
						|
 | 
						|
    import threading
 | 
						|
    import queue
 | 
						|
 | 
						|
    q = queue.Queue()
 | 
						|
 | 
						|
    def worker():
 | 
						|
        while True:
 | 
						|
            item = q.get()
 | 
						|
            print(f'Working on {item}')
 | 
						|
            print(f'Finished {item}')
 | 
						|
            q.task_done()
 | 
						|
 | 
						|
    # Turn-on the worker thread.
 | 
						|
    threading.Thread(target=worker, daemon=True).start()
 | 
						|
 | 
						|
    # Send thirty task requests to the worker.
 | 
						|
    for item in range(30):
 | 
						|
        q.put(item)
 | 
						|
 | 
						|
    # Block until all tasks are done.
 | 
						|
    q.join()
 | 
						|
    print('All work completed')
 | 
						|
 | 
						|
 | 
						|
SimpleQueue Objects
 | 
						|
-------------------
 | 
						|
 | 
						|
:class:`SimpleQueue` objects provide the public methods described below.
 | 
						|
 | 
						|
.. method:: SimpleQueue.qsize()
 | 
						|
 | 
						|
   Return the approximate size of the queue.  Note, qsize() > 0 doesn't
 | 
						|
   guarantee that a subsequent get() will not block.
 | 
						|
 | 
						|
 | 
						|
.. method:: SimpleQueue.empty()
 | 
						|
 | 
						|
   Return ``True`` if the queue is empty, ``False`` otherwise.  If empty()
 | 
						|
   returns ``False`` it doesn't guarantee that a subsequent call to get()
 | 
						|
   will not block.
 | 
						|
 | 
						|
 | 
						|
.. method:: SimpleQueue.put(item, block=True, timeout=None)
 | 
						|
 | 
						|
   Put *item* into the queue.  The method never blocks and always succeeds
 | 
						|
   (except for potential low-level errors such as failure to allocate memory).
 | 
						|
   The optional args *block* and *timeout* are ignored and only provided
 | 
						|
   for compatibility with :meth:`Queue.put`.
 | 
						|
 | 
						|
   .. impl-detail::
 | 
						|
      This method has a C implementation which is reentrant.  That is, a
 | 
						|
      ``put()`` or ``get()`` call can be interrupted by another ``put()``
 | 
						|
      call in the same thread without deadlocking or corrupting internal
 | 
						|
      state inside the queue.  This makes it appropriate for use in
 | 
						|
      destructors such as ``__del__`` methods or :mod:`weakref` callbacks.
 | 
						|
 | 
						|
 | 
						|
.. method:: SimpleQueue.put_nowait(item)
 | 
						|
 | 
						|
   Equivalent to ``put(item, block=False)``, provided for compatibility with
 | 
						|
   :meth:`Queue.put_nowait`.
 | 
						|
 | 
						|
 | 
						|
.. method:: SimpleQueue.get(block=True, timeout=None)
 | 
						|
 | 
						|
   Remove and return an item from the queue.  If optional args *block* is true and
 | 
						|
   *timeout* is ``None`` (the default), block if necessary until an item is available.
 | 
						|
   If *timeout* is a positive number, it blocks at most *timeout* seconds and
 | 
						|
   raises the :exc:`Empty` exception if no item was available within that time.
 | 
						|
   Otherwise (*block* is false), return an item if one is immediately available,
 | 
						|
   else raise the :exc:`Empty` exception (*timeout* is ignored in that case).
 | 
						|
 | 
						|
 | 
						|
.. method:: SimpleQueue.get_nowait()
 | 
						|
 | 
						|
   Equivalent to ``get(False)``.
 | 
						|
 | 
						|
 | 
						|
.. seealso::
 | 
						|
 | 
						|
   Class :class:`multiprocessing.Queue`
 | 
						|
      A queue class for use in a multi-processing (rather than multi-threading)
 | 
						|
      context.
 | 
						|
 | 
						|
   :class:`collections.deque` is an alternative implementation of unbounded
 | 
						|
   queues with fast atomic :meth:`~collections.deque.append` and
 | 
						|
   :meth:`~collections.deque.popleft` operations that do not require locking
 | 
						|
   and also support indexing.
 |