| 
									
										
										
										
											1998-04-04 07:23:21 +00:00
										 |  |  | \section{Built-in Module \module{thread}} | 
					
						
							| 
									
										
										
										
											1997-07-17 16:34:52 +00:00
										 |  |  | \label{module-thread} | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | \bimodindex{thread} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This module provides low-level primitives for working with multiple | 
					
						
							| 
									
										
										
										
											1995-03-13 10:03:32 +00:00
										 |  |  | threads (a.k.a.\ \dfn{light-weight processes} or \dfn{tasks}) --- multiple | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | threads of control sharing their global data space.  For | 
					
						
							| 
									
										
										
										
											1995-03-13 10:03:32 +00:00
										 |  |  | synchronization, simple locks (a.k.a.\ \dfn{mutexes} or \dfn{binary | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | semaphores}) are provided. | 
					
						
							| 
									
										
										
										
											1998-01-20 05:52:23 +00:00
										 |  |  | \index{light-weight processes} | 
					
						
							|  |  |  | \index{processes, light-weight} | 
					
						
							|  |  |  | \index{binary semaphores} | 
					
						
							|  |  |  | \index{semaphores, binary} | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-08-14 19:51:26 +00:00
										 |  |  | The module is optional.  It is supported on Windows NT and '95, SGI | 
					
						
							| 
									
										
										
										
											1998-02-09 20:27:12 +00:00
										 |  |  | IRIX, Solaris 2.x, as well as on systems that have a \POSIX{} thread | 
					
						
							| 
									
										
										
										
											1997-08-14 19:51:26 +00:00
										 |  |  | (a.k.a. ``pthread'') implementation. | 
					
						
							| 
									
										
										
										
											1998-01-20 05:52:23 +00:00
										 |  |  | \index{pthreads} | 
					
						
							| 
									
										
										
										
											1998-02-09 22:12:28 +00:00
										 |  |  | \indexii{threads}{\POSIX{}} | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | It defines the following constant and functions: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{excdesc}{error} | 
					
						
							|  |  |  | Raised on thread-specific errors. | 
					
						
							|  |  |  | \end{excdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-17 06:33:25 +00:00
										 |  |  | \begin{funcdesc}{start_new_thread}{func, arg} | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | Start a new thread.  The thread executes the function \var{func} | 
					
						
							|  |  |  | with the argument list \var{arg} (which must be a tuple).  When the | 
					
						
							| 
									
										
										
										
											1995-03-13 10:03:32 +00:00
										 |  |  | function returns, the thread silently exits.  When the function | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00: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-17 16:07:09 +00:00
										 |  |  | \begin{funcdesc}{exit}{} | 
					
						
							| 
									
										
										
										
											1998-04-03 06:35:54 +00:00
										 |  |  | This is a shorthand for \function{exit_thread()}. | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-03-17 16:07:09 +00:00
										 |  |  | \begin{funcdesc}{exit_thread}{} | 
					
						
							| 
									
										
										
										
											1998-04-03 06:35:54 +00:00
										 |  |  | Raise the \exception{SystemExit} exception.  When not caught, this | 
					
						
							|  |  |  | will cause the thread to exit silently. | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-03-17 16:07:09 +00: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.
 | 
					
						
							|  |  |  | %\strong{Caveat:} code in pending \code{finally} clauses, in this thread
 | 
					
						
							|  |  |  | %or in other threads, is not executed.
 | 
					
						
							|  |  |  | %\end{funcdesc}
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00: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 13:13:50 +00: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 06:35:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | Lock objects have the following methods: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-04-03 06:35:54 +00:00
										 |  |  | \begin{methoddesc}[lock]{acquire}{\optional{waitflag}} | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00: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 | 
					
						
							| 
									
										
										
										
											1995-03-13 10:03:32 +00:00
										 |  |  | \var{waitflag} argument is present, the action depends on its value:\ | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											1998-04-03 06:35:54 +00:00
										 |  |  | return value is \code{1} if the lock is acquired successfully, | 
					
						
							|  |  |  | \code{0} if not. | 
					
						
							|  |  |  | \end{methoddesc} | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-04-03 06:35:54 +00:00
										 |  |  | \begin{methoddesc}[lock]{release}{} | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | Releases the lock.  The lock must have been acquired earlier, but not | 
					
						
							|  |  |  | necessarily by the same thread. | 
					
						
							| 
									
										
										
										
											1998-04-03 06:35:54 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-04-03 06:35:54 +00: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 01:22:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-01-14 14:51:31 +00:00
										 |  |  | \strong{Caveats:} | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \begin{itemize} | 
					
						
							|  |  |  | \item | 
					
						
							|  |  |  | Threads interact strangely with interrupts: the | 
					
						
							| 
									
										
										
										
											1998-04-03 06:35:54 +00:00
										 |  |  | \exception{KeyboardInterrupt} exception will be received by an | 
					
						
							|  |  |  | arbitrary thread.  (When the \module{signal}\refbimodindex{signal} | 
					
						
							|  |  |  | module is available, interrupts always go to the main thread.) | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \item | 
					
						
							| 
									
										
										
										
											1998-04-03 06:35:54 +00:00
										 |  |  | Calling \function{sys.exit()} or raising the \exception{SystemExit} | 
					
						
							|  |  |  | exception is equivalent to calling \function{exit_thread()}. | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \item | 
					
						
							|  |  |  | Not all built-in functions that may block waiting for I/O allow other | 
					
						
							| 
									
										
										
										
											1998-04-03 06:35:54 +00:00
										 |  |  | threads to run.  (The most popular ones (\function{time.sleep()}, | 
					
						
							|  |  |  | \method{\var{file}.read()}, \function{select.select()}) work as | 
					
						
							|  |  |  | expected.) | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-08-14 19:51:26 +00:00
										 |  |  | \item | 
					
						
							| 
									
										
										
										
											1998-04-03 06:35:54 +00: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-14 19:51:26 +00: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 06:35:54 +00:00
										 |  |  | executing \keyword{try} ... \keyword{finally} clauses or executing | 
					
						
							|  |  |  | object destructors. | 
					
						
							| 
									
										
										
										
											1998-01-20 05:52:23 +00:00
										 |  |  | \indexii{threads}{IRIX} | 
					
						
							| 
									
										
										
										
											1997-08-14 19:51:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \item | 
					
						
							| 
									
										
										
										
											1998-04-03 06:35:54 +00: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-14 19:51:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-01-02 01:22:07 +00:00
										 |  |  | \end{itemize} |