
\section{\module{Queue} ---
         A synchronized queue class}

\declaremodule{standard}{Queue}
\modulesynopsis{A synchronized queue class.}


The \module{Queue} module implements a multi-producer, multi-consumer
FIFO queue.  It is especially useful in threads programming when
information must be exchanged safely between multiple threads.  The
\class{Queue} class in this module implements all the required locking
semantics.  It depends on the availability of thread support in
Python.

The \module{Queue} module defines the following class and exception:


\begin{classdesc}{Queue}{maxsize}
Constructor for the class.  \var{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 \var{maxsize} is less than or equal to
zero, the queue size is infinite.
\end{classdesc}

\begin{excdesc}{Empty}
Exception raised when non-blocking \method{get()} (or
\method{get_nowait()}) is called on a \class{Queue} object which is
empty.
\end{excdesc}

\begin{excdesc}{Full}
Exception raised when non-blocking \method{put()} (or
\method{put_nowait()}) is called on a \class{Queue} object which is
full.
\end{excdesc}

\subsection{Queue Objects}
\label{QueueObjects}

Class \class{Queue} implements queue objects and has the methods
described below.  This class can be derived from in order to implement
other queue organizations (e.g. stack) but the inheritable interface
is not described here.  See the source code for details.  The public
methods are:

\begin{methoddesc}{qsize}{}
Return the approximate size of the queue.  Because of multithreading
semantics, this number is not reliable.
\end{methoddesc}

\begin{methoddesc}{empty}{}
Return \code{True} if the queue is empty, \code{False} otherwise.
Because of multithreading semantics, this is not reliable.
\end{methoddesc}

\begin{methoddesc}{full}{}
Return \code{True} if the queue is full, \code{False} otherwise.
Because of multithreading semantics, this is not reliable.
\end{methoddesc}

\begin{methoddesc}{put}{item\optional{, block\optional{, timeout}}}
Put \var{item} into the queue. If optional args \var{block} is true
and \var{timeout} is None (the default), block if necessary until a
free slot is available. If \var{timeout} is a positive number, it
blocks at most \var{timeout} seconds and raises the \exception{Full}
exception if no free slot was available within that time.
Otherwise (\var{block} is false), put an item on the queue if a free
slot is immediately available, else raise the \exception{Full}
exception (\var{timeout} is ignored in that case).

\versionadded[the timeout parameter]{2.3}

\end{methoddesc}

\begin{methoddesc}{put_nowait}{item}
Equivalent to \code{put(\var{item}, False)}.
\end{methoddesc}

\begin{methoddesc}{get}{\optional{block\optional{, timeout}}}
Remove and return an item from the queue. If optional args
\var{block} is true and \var{timeout} is None (the default),
block if necessary until an item is available. If \var{timeout} is
a positive number, it blocks at most \var{timeout} seconds and raises
the \exception{Empty} exception if no item was available within that
time. Otherwise (\var{block} is false), return an item if one is
immediately available, else raise the \exception{Empty} exception
(\var{timeout} is ignored in that case).

\versionadded[the timeout parameter]{2.3}

\end{methoddesc}

\begin{methoddesc}{get_nowait}{}
Equivalent to \code{get(False)}.
\end{methoddesc}

Two methods are offered to support tracking whether enqueued tasks have
been fully processed by daemon consumer threads.

\begin{methoddesc}{task_done}{}
Indicate that a formerly enqueued task is complete.  Used by queue consumer
threads.  For each \method{get()} used to fetch a task, a subsequent call to
\method{task_done()} tells the queue that the processing on the task is complete.

If a \method{join()} is currently blocking, it will resume when all items
have been processed (meaning that a \method{task_done()} call was received
for every item that had been \method{put()} into the queue).

Raises a \exception{ValueError} if called more times than there were items
placed in the queue.
\versionadded{2.5}
\end{methoddesc}

\begin{methoddesc}{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 \method{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, join() unblocks.
\versionadded{2.5}
\end{methoddesc}

Example of how to wait for enqueued tasks to be completed:

\begin{verbatim}
    def worker(): 
        while True: 
            item = q.get() 
            do_work(item) 
            q.task_done() 

    q = Queue() 
    for i in range(num_worker_threads): 
         t = Thread(target=worker)
         t.setDaemon(True)
         t.start() 

    for item in source():
        q.put(item) 

    q.join()       # block until all tasks are done
\end{verbatim}
