mirror of
				https://github.com/python/cpython.git
				synced 2025-10-26 00:08:32 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			317 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			317 lines
		
	
	
	
		
			11 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.
 | |
| 
 | |
| 
 | |
| .. 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` will be unblocked. If *immediate*
 | |
|    is true, also unblock callers of :meth:`~Queue.get` and :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.
 | 
