\section{\module{threading} ---
         Higher-level threading interface}

\declaremodule{standard}{threading}
\modulesynopsis{Higher-level threading interface.}


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

This module is safe for use with \samp{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 \label{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 \refmodule{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}{\optional{blocking\code{ = 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 \label{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}{\optional{blocking\code{ = 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 \label{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}{\optional{lock}}
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}{\optional{timeout}}
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 \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).

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 \label{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}{\optional{value}}
The optional argument gives the initial value for the internal
counter; it defaults to \code{1}.
\end{classdesc}

\begin{methoddesc}{acquire}{\optional{blocking}}
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 \var{blocking} set to true, do the same thing as
when called without arguments, and return true.

When invoked with \var{blocking} 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 \label{event-objects}}

This is one of the simplest mechanisms for communication between
threads: one thread signals an event and one or more other threads
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}{\optional{timeout}}
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 \label{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:

\var{group}
Should be \code{None}; reserved for future extension when a
\class{ThreadGroup} class is implemented.

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

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

\var{args}
Argument tuple for the target invocation.  Defaults to \code{()}.

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

If the subclass overrides the constructor, it must make sure
to invoke the base class constructor (\code{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}{\optional{timeout}}
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}

