: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.


.. exception:: ShutDown

   Exception raised when :meth:`~Queue.put` or :meth:`~Queue.get` is called on
   a :class:`Queue` object which has been shut down.

   .. versionadded:: 3.13


.. _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).

   Raises :exc:`ShutDown` if the queue has been shut down.


.. 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`.

   Raises :exc:`ShutDown` if the queue has been shut down and is empty, or if
   the queue has been shut down immediately.


.. 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).

   ``shutdown(immediate=True)`` calls :meth:`task_done` for each remaining item
   in 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')


Terminating queues
^^^^^^^^^^^^^^^^^^

:class:`Queue` objects can be made to prevent further interaction by shutting
them down.

.. method:: Queue.shutdown(immediate=False)

   Shut down the queue, making :meth:`~Queue.get` and :meth:`~Queue.put` raise
   :exc:`ShutDown`.

   By default, :meth:`~Queue.get` on a shut down queue will only raise once the
   queue is empty. Set *immediate* to true to make :meth:`~Queue.get` raise
   immediately instead.

   All blocked callers of :meth:`~Queue.put` and :meth:`~Queue.get` will be
   unblocked. If *immediate* is true, a task will be marked as done for each
   remaining item in the queue, which may unblock callers of
   :meth:`~Queue.join`.

   .. versionadded:: 3.13


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.
