1998-08-11 03:42:37 +08:00
|
|
|
\section{\module{thread} ---
|
1999-04-22 02:01:14 +08:00
|
|
|
Multiple threads of control}
|
1998-07-24 01:59:49 +08:00
|
|
|
|
1999-04-22 02:01:14 +08:00
|
|
|
\declaremodule{builtin}{thread}
|
1998-08-11 03:42:37 +08:00
|
|
|
\modulesynopsis{Create multiple threads of control within one interpreter.}
|
1998-07-24 01:59:49 +08:00
|
|
|
|
1994-01-02 09:22:07 +08:00
|
|
|
|
|
|
|
This module provides low-level primitives for working with multiple
|
1995-03-13 18:03:32 +08:00
|
|
|
threads (a.k.a.\ \dfn{light-weight processes} or \dfn{tasks}) --- multiple
|
1994-01-02 09:22:07 +08:00
|
|
|
threads of control sharing their global data space. For
|
1995-03-13 18:03:32 +08:00
|
|
|
synchronization, simple locks (a.k.a.\ \dfn{mutexes} or \dfn{binary
|
1994-01-02 09:22:07 +08:00
|
|
|
semaphores}) are provided.
|
1998-01-20 13:52:23 +08:00
|
|
|
\index{light-weight processes}
|
|
|
|
\index{processes, light-weight}
|
|
|
|
\index{binary semaphores}
|
|
|
|
\index{semaphores, binary}
|
1994-01-02 09:22:07 +08:00
|
|
|
|
1997-08-15 03:51:26 +08:00
|
|
|
The module is optional. It is supported on Windows NT and '95, SGI
|
1998-02-10 04:27:12 +08:00
|
|
|
IRIX, Solaris 2.x, as well as on systems that have a \POSIX{} thread
|
1997-08-15 03:51:26 +08:00
|
|
|
(a.k.a. ``pthread'') implementation.
|
1998-01-20 13:52:23 +08:00
|
|
|
\index{pthreads}
|
1998-02-10 06:12:28 +08:00
|
|
|
\indexii{threads}{\POSIX{}}
|
1994-01-02 09:22:07 +08:00
|
|
|
|
|
|
|
It defines the following constant and functions:
|
|
|
|
|
|
|
|
\begin{excdesc}{error}
|
|
|
|
Raised on thread-specific errors.
|
|
|
|
\end{excdesc}
|
|
|
|
|
1998-06-28 02:25:44 +08:00
|
|
|
\begin{datadesc}{LockType}
|
|
|
|
This is the type of lock objects.
|
|
|
|
\end{datadesc}
|
|
|
|
|
1999-04-22 02:01:14 +08:00
|
|
|
\begin{funcdesc}{start_new_thread}{function, args\optional{, kwargs}}
|
1998-06-28 02:25:44 +08:00
|
|
|
Start a new thread. The thread executes the function \var{function}
|
|
|
|
with the argument list \var{args} (which must be a tuple). The
|
|
|
|
optional \var{kwargs} argument specifies a dictionary of keyword
|
|
|
|
arguments. When the
|
1995-03-13 18:03:32 +08:00
|
|
|
function returns, the thread silently exits. When the function
|
1994-01-02 09:22:07 +08:00
|
|
|
terminates with an unhandled exception, a stack trace is printed and
|
|
|
|
then the thread exits (but other threads continue to run).
|
|
|
|
\end{funcdesc}
|
|
|
|
|
1995-03-18 00:07:09 +08:00
|
|
|
\begin{funcdesc}{exit}{}
|
1998-06-28 02:25:44 +08:00
|
|
|
Raise the \exception{SystemExit} exception. When not caught, this
|
|
|
|
will cause the thread to exit silently.
|
1994-01-02 09:22:07 +08:00
|
|
|
\end{funcdesc}
|
|
|
|
|
1995-03-18 00:07:09 +08:00
|
|
|
\begin{funcdesc}{exit_thread}{}
|
1998-07-03 03:33:12 +08:00
|
|
|
\deprecated{1.5.2}{Use \function{exit()}.}
|
1998-06-28 02:25:44 +08:00
|
|
|
This is an obsolete synonym for \function{exit()}.
|
1994-01-02 09:22:07 +08:00
|
|
|
\end{funcdesc}
|
|
|
|
|
1995-03-18 00:07:09 +08:00
|
|
|
%\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.
|
1999-04-22 02:01:14 +08:00
|
|
|
%\strong{Caveat:} code in pending \keyword{finally} clauses, in this thread
|
1995-03-18 00:07:09 +08:00
|
|
|
%or in other threads, is not executed.
|
|
|
|
%\end{funcdesc}
|
|
|
|
|
1994-01-02 09:22:07 +08:00
|
|
|
\begin{funcdesc}{allocate_lock}{}
|
|
|
|
Return a new lock object. Methods of locks are described below. The
|
|
|
|
lock is initially unlocked.
|
|
|
|
\end{funcdesc}
|
|
|
|
|
1994-08-12 21:13:50 +08:00
|
|
|
\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}
|
|
|
|
|
1998-04-03 14:35:54 +08:00
|
|
|
|
1994-01-02 09:22:07 +08:00
|
|
|
Lock objects have the following methods:
|
|
|
|
|
1998-04-03 14:35:54 +08:00
|
|
|
\begin{methoddesc}[lock]{acquire}{\optional{waitflag}}
|
1994-01-02 09:22:07 +08:00
|
|
|
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
|
1998-12-01 00:26:50 +08:00
|
|
|
\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
|
1994-01-02 09:22:07 +08:00
|
|
|
immediately without waiting, while if it is nonzero, the lock is
|
|
|
|
acquired unconditionally as before. If an argument is present, the
|
1998-04-03 14:35:54 +08:00
|
|
|
return value is \code{1} if the lock is acquired successfully,
|
|
|
|
\code{0} if not.
|
|
|
|
\end{methoddesc}
|
1994-01-02 09:22:07 +08:00
|
|
|
|
1998-04-03 14:35:54 +08:00
|
|
|
\begin{methoddesc}[lock]{release}{}
|
1994-01-02 09:22:07 +08:00
|
|
|
Releases the lock. The lock must have been acquired earlier, but not
|
|
|
|
necessarily by the same thread.
|
1998-04-03 14:35:54 +08:00
|
|
|
\end{methoddesc}
|
1994-01-02 09:22:07 +08:00
|
|
|
|
1998-04-03 14:35:54 +08:00
|
|
|
\begin{methoddesc}[lock]{locked}{}
|
|
|
|
Return the status of the lock:\ \code{1} if it has been acquired by
|
|
|
|
some thread, \code{0} if not.
|
|
|
|
\end{methoddesc}
|
1994-01-02 09:22:07 +08:00
|
|
|
|
1998-01-14 22:51:31 +08:00
|
|
|
\strong{Caveats:}
|
1994-01-02 09:22:07 +08:00
|
|
|
|
|
|
|
\begin{itemize}
|
|
|
|
\item
|
|
|
|
Threads interact strangely with interrupts: the
|
1998-04-03 14:35:54 +08:00
|
|
|
\exception{KeyboardInterrupt} exception will be received by an
|
1999-04-22 02:01:14 +08:00
|
|
|
arbitrary thread. (When the \refmodule{signal}\refbimodindex{signal}
|
1998-04-03 14:35:54 +08:00
|
|
|
module is available, interrupts always go to the main thread.)
|
1994-01-02 09:22:07 +08:00
|
|
|
|
|
|
|
\item
|
1998-04-03 14:35:54 +08:00
|
|
|
Calling \function{sys.exit()} or raising the \exception{SystemExit}
|
2000-04-05 23:00:38 +08:00
|
|
|
exception is equivalent to calling \function{exit()}.
|
1994-01-02 09:22:07 +08:00
|
|
|
|
|
|
|
\item
|
|
|
|
Not all built-in functions that may block waiting for I/O allow other
|
1998-04-03 14:35:54 +08:00
|
|
|
threads to run. (The most popular ones (\function{time.sleep()},
|
|
|
|
\method{\var{file}.read()}, \function{select.select()}) work as
|
|
|
|
expected.)
|
1994-01-02 09:22:07 +08:00
|
|
|
|
1997-08-15 03:51:26 +08:00
|
|
|
\item
|
1998-04-03 14:35:54 +08:00
|
|
|
It is not possible to interrupt the \method{acquire()} method on a lock
|
|
|
|
--- the \exception{KeyboardInterrupt} exception will happen after the
|
|
|
|
lock has been acquired.
|
1997-08-15 03:51:26 +08:00
|
|
|
|
|
|
|
\item
|
|
|
|
When the main thread exits, it is system defined whether the other
|
|
|
|
threads survive. On SGI IRIX using the native thread implementation,
|
|
|
|
they survive. On most other systems, they are killed without
|
1998-04-03 14:35:54 +08:00
|
|
|
executing \keyword{try} ... \keyword{finally} clauses or executing
|
|
|
|
object destructors.
|
1998-01-20 13:52:23 +08:00
|
|
|
\indexii{threads}{IRIX}
|
1997-08-15 03:51:26 +08:00
|
|
|
|
|
|
|
\item
|
1998-04-03 14:35:54 +08:00
|
|
|
When the main thread exits, it does not do any of its usual cleanup
|
|
|
|
(except that \keyword{try} ... \keyword{finally} clauses are honored),
|
|
|
|
and the standard I/O files are not flushed.
|
1997-08-15 03:51:26 +08:00
|
|
|
|
1994-01-02 09:22:07 +08:00
|
|
|
\end{itemize}
|