\section{Standard Module \module{threading}}
\label{module-threading}
\stmodindex{threading}

This module constructs higher-level threading interfaces on top of the
lower level
\module{thread} module.

This module is safe for use with \code{from threading import *}.  It
defines the following functions and objects:

\begin{funcdesc}{activeCount}{}
Return the number of currently active \class{Thread} objects.
The returned count is equal to the length of the list returned by
\function{enumerate()}.
A function that returns the number of currently active threads.
\end{funcdesc}

\begin{funcdesc}{Condition}{}
A factory function that returns a new condition variable object.
A condition variable allows one or more threads to wait until they
are notified by another thread.
\end{funcdesc}

\begin{funcdesc}{currentThread}{}
Return the current \class{Thread} object, corresponding to the
caller's thread of control.  If the caller's thread of control was not
created through the
\module{threading} module, a dummy thread object with limited functionality
is returned.
\end{funcdesc}

\begin{funcdesc}{enumerate}{}
Return a list of all currently active \class{Thread} objects.
The list includes daemonic threads, dummy thread objects created
by \function{currentThread()}, and the main thread.  It excludes terminated
threads and threads that have not yet been started.
\end{funcdesc}

\begin{funcdesc}{Event}{}
A factory function that returns a new event object.  An event
manages a flag that can be set to true with the \method{set()} method and
reset to false with the \method{clear()} method.  The \method{wait()} method blocks
until the flag is true.
\end{funcdesc}

\begin{funcdesc}{Lock}{}
A factory function that returns a new primitive lock object.  Once
a thread has acquired it, subsequent attempts to acquire it block,
until it is released; any thread may release it.
\end{funcdesc}

\begin{funcdesc}{RLock}{}
A factory function that returns a new reentrant lock object.
A reentrant lock must be released by the thread that acquired it.
Once a thread has acquired a reentrant lock, the same thread may
acquire it again without blocking; the thread must release it once
for each time it has acquired it.
\end{funcdesc}

\begin{funcdesc}{Semaphore}{}
A factory function that returns a new semaphore object.  A
semaphore manages a counter representing the number of \method{release()}
calls minus the number of \method{acquire()} calls, plus an initial value.
The \method{acquire()} method blocks if necessary until it can return
without making the counter negative.
\end{funcdesc}

\begin{classdesc}{Thread}{}
A class that represents a thread of control.  This class can be safely subclassed in a limited fashion.
\end{classdesc}

Detailed interfaces for the objects are documented below.  

The design of this module is loosely based on Java's threading model.
However, where Java makes locks and condition variables basic behavior
of every object, they are separate objects in Python.  Python's \class{Thread}
class supports a subset of the behavior of Java's Thread class;
currently, there are no priorities, no thread groups, and threads
cannot be destroyed, stopped, suspended, resumed, or interrupted.  The
static methods of Java's Thread class, when implemented, are mapped to
module-level functions.

All of the methods described below are executed atomically.

\subsection{Lock Objects}

A primitive lock is a synchronization primitive that is not owned
by a particular thread when locked.  In Python, it is currently
the lowest level synchronization primitive available, implemented
directly by the \module{thread} extension module.

A primitive lock is in one of two states, ``locked'' or ``unlocked''.
It is created in the unlocked state.  It has two basic methods,
\method{acquire()} and \method{release()}.  When the state is
unlocked, \method{acquire()} changes the state to locked and returns
immediately.  When the state is locked, \method{acquire()} blocks
until a call to \method{release()} in another thread changes it to
unlocked, then the \method{acquire()} call resets it to locked and
returns.  The \method{release()} method should only be called in the
locked state; it changes the state to unlocked and returns
immediately.  When more than one thread is blocked in
\method{acquire()} waiting for the state to turn to unlocked, only one
thread proceeds when a \method{release()} call resets the state to
unlocked; which one of the waiting threads proceeds is not defined,
and may vary across implementations.

All methods are executed atomically.

\begin{methoddesc}{acquire}{blocking=1}
Acquire a lock, blocking or non-blocking.

When invoked without arguments, block until the lock is
unlocked, then set it to locked, and return.  There is no
return value in this case.

When invoked with the \var{blocking} argument set to true, do the
same thing as when called without arguments, and return true.

When invoked with the \var{blocking} argument set to false, do not
block.  If a call without an argument would block, return false
immediately; otherwise, do the same thing as when called
without arguments, and return true.
\end{methoddesc}

\begin{methoddesc}{release}{}
Release a lock.

When the lock is locked, reset it to unlocked, and return.  If
any other threads are blocked waiting for the lock to become
unlocked, allow exactly one of them to proceed.

Do not call this method when the lock is unlocked.

There is no return value.
\end{methoddesc}

\subsection{RLock Objects}

A reentrant lock is a synchronization primitive that may be
acquired multiple times by the same thread.  Internally, it uses
the concepts of ``owning thread'' and ``recursion level'' in
addition to the locked/unlocked state used by primitive locks.  In
the locked state, some thread owns the lock; in the unlocked
state, no thread owns it.

To lock the lock, a thread calls its \method{acquire()} method; this
returns once the thread owns the lock.  To unlock the lock, a
thread calls its \method{release()} method.  \method{acquire()}/\method{release()} call pairs
may be nested; only the final \method{release()} (i.e. the \method{release()} of the
outermost pair) resets the lock to unlocked and allows another
thread blocked in \method{acquire()} to proceed.

\begin{methoddesc}{acquire}{blocking=1}
Acquire a lock, blocking or non-blocking.

When invoked without arguments: if this thread already owns
the lock, increment the recursion level by one, and return
immediately.  Otherwise, if another thread owns the lock,
block until the lock is unlocked.  Once the lock is unlocked
(not owned by any thread), then grab ownership, set the
recursion level to one, and return.  If more than one thread
is blocked waiting until the lock is unlocked, only one at a
time will be able to grab ownership of the lock.  There is no
return value in this case.

When invoked with the \var{blocking} argument set to true, do the
same thing as when called without arguments, and return true.

When invoked with the \var{blocking} argument set to false, do not
block.  If a call without an argument would block, return false
immediately; otherwise, do the same thing as when called
without arguments, and return true.
\end{methoddesc}

\begin{methoddesc}{release}{}
Release a lock, decrementing the recursion level.  If after the
decrement it is zero, reset the lock to unlocked (not owned by any
thread), and if any other threads are blocked waiting for the lock to
become unlocked, allow exactly one of them to proceed.  If after the
decrement the recursion level is still nonzero, the lock remains
locked and owned by the calling thread.

Only call this method when the calling thread owns the lock.
Do not call this method when the lock is unlocked.

There is no return value.
\end{methoddesc}

\subsection{Condition Objects}

A condition variable is always associated with some kind of lock;
this can be passed in or one will be created by default.  (Passing
one in is useful when several condition variables must share the
same lock.)

A condition variable has \method{acquire()} and \method{release()}
methods that call the corresponding methods of the associated lock.
It also has a \method{wait()} method, and \method{notify()} and
\method{notifyAll()} methods.  These three must only be called when
the calling thread has acquired the lock.

The \method{wait()} method releases the lock, and then blocks until it
is awakened by a \method{notify()} or \method{notifyAll()} call for
the same condition variable in another thread.  Once awakened, it
re-acquires the lock and returns.  It is also possible to specify a
timeout.

The \method{notify()} method wakes up one of the threads waiting for
the condition variable, if any are waiting.  The \method{notifyAll()}
method wakes up all threads waiting for the condition variable.

Note: the \method{notify()} and \method{notifyAll()} methods don't
release the lock; this means that the thread or threads awakened will
not return from their \method{wait()} call immediately, but only when
the thread that called \method{notify()} or \method{notifyAll()}
finally relinquishes ownership of the lock.

Tip: the typical programming style using condition variables uses the
lock to synchronize access to some shared state; threads that are
interested in a particular change of state call \method{wait()}
repeatedly until they see the desired state, while threads that modify
the state call \method{notify()} or \method{notifyAll()} when they
change the state in such a way that it could possibly be a desired
state for one of the waiters.  For example, the following code is a
generic producer-consumer situation with unlimited buffer capacity:

\begin{verbatim}
# Consume one item
cv.acquire()
while not an_item_is_available():
    cv.wait()
get_an_available_item()
cv.release()

# Produce one item
cv.acquire()
make_an_item_available()
cv.notify()
cv.release()
\end{verbatim}

To choose between \method{notify()} and \method{notifyAll()}, consider
whether one state change can be interesting for only one or several
waiting threads.  E.g. in a typical producer-consumer situation,
adding one item to the buffer only needs to wake up one consumer
thread.

\begin{classdesc}{Condition}{lock=None}
If the \var{lock} argument is given and not \code{None}, it must be a \class{Lock}
or \class{RLock} object, and it is used as the underlying lock.
Otherwise, a new \class{RLock} object is created and used as the
underlying lock.
\end{classdesc}

\begin{methoddesc}{acquire}{*args}
Acquire the underlying lock.
This method calls the corresponding method on the underlying
lock; the return value is whatever that method returns.
\end{methoddesc}

\begin{methoddesc}{release}{}
Release the underlying lock.
This method calls the corresponding method on the underlying
lock; there is no return value.
\end{methoddesc}

\begin{methoddesc}{wait}{timeout=None}
Wait until notified or until a timeout occurs.
This must only be called when the calling thread has acquired the
lock.

This method releases the underlying lock, and then blocks until it is
awakened by a \method{notify()} or \method{notifyAll()} call for the
same condition variable in another thread, or until the optional
timeout occurs.  Once awakened or timed out, it re-acquires the lock
and returns.

When the timeout argument is present and not \code{None}, it should be a
floating point number specifying a timeout for the operation in
seconds (or fractions thereof).

When the underlying lock is an \class{RLock}, it is not released using its
\method{release()} method, since this may not actually unlock the lock
when it was acquired multiple times recursively.  Instead, an
internal interface of the \class{RLock} class is used, which really unlocks it
even when it has been recursively acquired several times.  Another
internal interface is then used to restore the recursion level when
the lock is reacquired.
\end{methoddesc}

\begin{methoddesc}{notify}{}
Wake up a thread waiting on this condition, if any.
This must only be called when the calling thread has acquired the
lock.

This method wakes up one of the threads waiting for the condition
variable, if any are waiting; it is a no-op if no threads are waiting.

The current implementation wakes up exactly one thread, if any are
waiting.  However, it's not safe to rely on this behavior.  A future,
optimized implementation may occasionally wake up more than one
thread.

Note: the awakened thread does not actually return from its
\method{wait()} call until it can reacquire the lock.  Since
\method{notify()} does not release the lock, its caller should.
\end{methoddesc}

\begin{methoddesc}{notifyAll}{}
Wake up all threads waiting on this condition.  This method acts like
\method{notify()}, but wakes up all waiting threads instead of one.
\end{methoddesc}

\subsection{Semaphore Objects}

This is one of the oldest synchronization primitives in the history of
computer science, invented by the early Dutch computer scientist
Edsger W. Dijkstra (he used \method{P()} and \method{V()} instead of \method{acquire()}
and \method{release()}).

A semaphore manages an internal counter which is decremented by each
\method{acquire()} call and incremented by each \method{release()}
call.  The counter can never go below zero; when \method{acquire()}
finds that it is zero, it blocks, waiting until some other thread
calls \method{release()}.

\begin{classdesc}{Semaphore}{value=1}
The optional argument gives the initial value for the internal
counter; it defaults to 1.
\end{classdesc}

\begin{methoddesc}{acquire}{blocking=1}
Acquire a semaphore.

When invoked without arguments: if the internal counter is larger than
zero on entry, decrement it by one and return immediately.  If it is
zero on entry, block, waiting until some other thread has called
\method{release()} to make it larger than zero.  This is done with
proper interlocking so that if multiple \method{acquire()} calls are
blocked, \method{release()} will wake exactly one of them up.  The
implementation may pick one at random, so the order in which blocked
threads are awakened should not be relied on.  There is no return
value in this case.

When invoked with the \var{blocking} argument set to true, do the same
thing as when called without arguments, and return true.

When invoked with the \var{blocking} argument set to false, do not
block.  If a call without an argument would block, return false
immediately; otherwise, do the same thing as when called without
arguments, and return true.
\end{methoddesc}

\begin{methoddesc}{release}{}
Release a semaphore,
incrementing the internal counter by one.  When it was zero on
entry and another thread is waiting for it to become larger
than zero again, wake up that thread.
\end{methoddesc}

\subsection{Event Objects}

This is one of the simplest mechanisms for communication between
threads: one thread signals an event and one or more other thread
are waiting for it.

An event object manages an internal flag that can be set to true with
the \method{set()} method and reset to false with the \method{clear()} method.  The
\method{wait()} method blocks until the flag is true.


\begin{classdesc}{Event}{}
The internal flag is initially false.
\end{classdesc}

\begin{methoddesc}{isSet}{}
Return true if and only if the internal flag is true.
\end{methoddesc}

\begin{methoddesc}{set}{}
Set the internal flag to true.
All threads waiting for it to become true are awakened.
Threads that call \method{wait()} once the flag is true will not block
at all.
\end{methoddesc}

\begin{methoddesc}{clear}{}
Reset the internal flag to false.
Subsequently, threads calling \method{wait()} will block until \method{set()} is
called to set the internal flag to true again.
\end{methoddesc}

\begin{methoddesc}{wait}{timeout=None}
Block until the internal flag is true.
If the internal flag is true on entry, return immediately.  Otherwise,
block until another thread calls \method{set()} to set the flag to
true, or until the optional timeout occurs.

When the timeout argument is present and not \code{None}, it should be a
floating point number specifying a timeout for the operation in
seconds (or fractions thereof).
\end{methoddesc}

\subsection{Thread Objects}

This class represents an activity that is run in a separate thread
of control.  There are two ways to specify the activity: by
passing a callable object to the constructor, or by overriding the
\method{run()} method in a subclass.  No other methods (except for the
constructor) should be overridden in a subclass.  In other words, 
\emph{only}  override the \method{__init__()} and \method{run()} methods of this class.


Once a thread object is created, its activity must be started by
calling the thread's \method{start()} method.  This invokes the \method{run()}
method in a separate thread of control.

Once the thread's activity is started, the thread is considered
'alive' and 'active' (these concepts are almost, but not quite
exactly, the same; their definition is intentionally somewhat
vague).  It stops being alive and active when its \method{run()} method
terminates -- either normally, or by raising an unhandled
exception.  The \method{isAlive()} method tests whether the thread is
alive.

Other threads can call a thread's \method{join()} method.  This blocks the
calling thread until the thread whose \method{join()} method is called
is terminated.

A thread has a name.  The name can be passed to the constructor,
set with the \method{setName()} method, and retrieved with the \method{getName()}
method.

A thread can be flagged as a ``daemon thread''.  The significance
of this flag is that the entire Python program exits when only
daemon threads are left.  The initial value is inherited from the
creating thread.  The flag can be set with the \method{setDaemon()} method
and retrieved with the \method{getDaemon()} method.

There is a ``main thread'' object; this corresponds to the
initial thread of control in the Python program.  It is not a
daemon thread.

There is the possibility that ``dummy thread objects'' are
created.  These are thread objects corresponding to ``alien
threads''.  These are threads of control started outside the
threading module, e.g. directly from C code.  Dummy thread objects
have limited functionality; they are always considered alive,
active, and daemonic, and cannot be \method{join()}ed.  They are never
deleted, since it is impossible to detect the termination of alien
threads.


\begin{classdesc}{Thread}{group=None, target=None, name=None,
 args=(), kwargs={}}
This constructor should always be called with keyword
arguments.  Arguments are:

group
Should be None; reserved for future extension when a
ThreadGroup class is implemented.

target
Callable object to be invoked by the \method{run()} method.
Defaults to None, meaning nothing is called.

name
The thread name.  By default, a unique name is constructed
of the form ``Thread-N'' where N is a small decimal
number.

args
Argument tuple for the target invocation.  Defaults to ().

kwargs
Keyword argument dictionary for the target invocation.
Defaults to {}.

If the subclass overrides the constructor, it must make sure
to invoke the base class constructor (Thread.__init__())
before doing anything else to the thread.
\end{classdesc}



\begin{methoddesc}{start}{}
Start the thread's activity.

This must be called at most once per thread object.  It
arranges for the object's \method{run()} method to be invoked in a
separate thread of control.
\end{methoddesc}



\begin{methoddesc}{run}{}
Method representing the thread's activity.

You may override this method in a subclass.  The standard
\method{run()} method invokes the callable object passed to the object's constructor as the
\var{target} argument, if any, with sequential and keyword
arguments taken from the \var{args} and \var{kwargs} arguments,
respectively.
\end{methoddesc}


\begin{methoddesc}{join}{timeout=None}
Wait until the thread terminates.
This blocks the calling thread until the thread whose \method{join()}
method is called terminates -- either normally or through an
unhandled exception -- or until the optional timeout occurs.

When the \var{timeout} argument is present and not \code{None}, it should
be a floating point number specifying a timeout for the
operation in seconds (or fractions thereof).

A thread can be \method{join()}ed many times.

A thread cannot join itself because this would cause a
deadlock.

It is an error to attempt to \method{join()} a thread before it has
been started.
\end{methoddesc}



\begin{methoddesc}{getName}{}
Return the thread's name.
\end{methoddesc}

\begin{methoddesc}{setName}{name}
Set the thread's name.

The name is a string used for identification purposes only.
It has no semantics.  Multiple threads may be given the same
name.  The initial name is set by the constructor.
\end{methoddesc}

\begin{methoddesc}{isAlive}{}
Return whether the thread is alive.

Roughly, a thread is alive from the moment the \method{start()} method
returns until its \method{run()} method terminates.
\end{methoddesc}

\begin{methoddesc}{isDaemon}{}
Return the thread's daemon flag.
\end{methoddesc}

\begin{methoddesc}{setDaemon}{daemonic}
Set the thread's daemon flag to the Boolean value \var{daemonic}.
This must be called before \method{start()} is called.

The initial value is inherited from the creating thread.

The entire Python program exits when no active non-daemon
threads are left.
\end{methoddesc}

