| \section{Built-in Module \sectcode{thread}} | 
 | \bimodindex{thread} | 
 |  | 
 | This module provides low-level primitives for working with multiple | 
 | threads (a.k.a.\ \dfn{light-weight processes} or \dfn{tasks}) --- multiple | 
 | threads of control sharing their global data space.  For | 
 | synchronization, simple locks (a.k.a.\ \dfn{mutexes} or \dfn{binary | 
 | semaphores}) are provided. | 
 |  | 
 | The module is optional and supported on SGI IRIX 4.x and 5.x and Sun | 
 | Solaris 2.x systems, as well as on systems that have a PTHREAD | 
 | implementation (e.g.\ KSR). | 
 |  | 
 | It defines the following constant and functions: | 
 |  | 
 | \renewcommand{\indexsubitem}{(in module thread)} | 
 | \begin{excdesc}{error} | 
 | Raised on thread-specific errors. | 
 | \end{excdesc} | 
 |  | 
 | \begin{funcdesc}{start_new_thread}{func\, arg} | 
 | Start a new thread.  The thread executes the function \var{func} | 
 | with the argument list \var{arg} (which must be a tuple).  When the | 
 | function returns, the thread silently exits.  When the function | 
 | terminates with an unhandled exception, a stack trace is printed and | 
 | then the thread exits (but other threads continue to run). | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{exit}{} | 
 | This is a shorthand for \code{thread.exit_thread()}. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{exit_thread}{} | 
 | Raise the \code{SystemExit} exception.  When not caught, this will | 
 | cause the thread to exit silently. | 
 | \end{funcdesc} | 
 |  | 
 | %\begin{funcdesc}{exit_prog}{status} | 
 | %Exit all threads and report the value of the integer argument | 
 | %\var{status} as the exit status of the entire program. | 
 | %\strong{Caveat:} code in pending \code{finally} clauses, in this thread | 
 | %or in other threads, is not executed. | 
 | %\end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{allocate_lock}{} | 
 | Return a new lock object.  Methods of locks are described below.  The | 
 | lock is initially unlocked. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{get_ident}{} | 
 | Return the `thread identifier' of the current thread.  This is a | 
 | nonzero integer.  Its value has no direct meaning; it is intended as a | 
 | magic cookie to be used e.g. to index a dictionary of thread-specific | 
 | data.  Thread identifiers may be recycled when a thread exits and | 
 | another thread is created. | 
 | \end{funcdesc} | 
 |  | 
 | Lock objects have the following methods: | 
 |  | 
 | \renewcommand{\indexsubitem}{(lock method)} | 
 | \begin{funcdesc}{acquire}{\optional{waitflag}} | 
 | Without the optional argument, this method acquires the lock | 
 | unconditionally, if necessary waiting until it is released by another | 
 | thread (only one thread at a time can acquire a lock --- that's their | 
 | reason for existence), and returns \code{None}.  If the integer | 
 | \var{waitflag} argument is present, the action depends on its value:\ | 
 | if it is zero, the lock is only acquired if it can be acquired | 
 | immediately without waiting, while if it is nonzero, the lock is | 
 | acquired unconditionally as before.  If an argument is present, the | 
 | return value is 1 if the lock is acquired successfully, 0 if not. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{release}{} | 
 | Releases the lock.  The lock must have been acquired earlier, but not | 
 | necessarily by the same thread. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{locked}{} | 
 | Return the status of the lock:\ 1 if it has been acquired by some | 
 | thread, 0 if not. | 
 | \end{funcdesc} | 
 |  | 
 | {\bf Caveats:} | 
 |  | 
 | \begin{itemize} | 
 | \item | 
 | Threads interact strangely with interrupts: the | 
 | \code{KeyboardInterrupt} exception will be received by an arbitrary | 
 | thread.  (When the \code{signal} module is available, interrupts | 
 | always go to the main thread.) | 
 |  | 
 | \item | 
 | Calling \code{sys.exit()} or raising the \code{SystemExit} is | 
 | equivalent to calling \code{thread.exit_thread()}. | 
 |  | 
 | \item | 
 | Not all built-in functions that may block waiting for I/O allow other | 
 | threads to run.  (The most popular ones (\code{sleep}, \code{read}, | 
 | \code{select}) work as expected.) | 
 |  | 
 | \end{itemize} |