cinap_lenrekadd hg and python4bb9e2215 years agoHistory
716 lines · 27.2 KB · TeX
RawDownload
\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. The \refmodule[dummythreading]{dummy_threading} module is provided forsituations where \module{threading} cannot be used because\refmodule{thread} is missing. This module defines the following functions and objects: \begin{funcdesc}{activeCount}{}Return the number of \class{Thread} objects currently alive.  Thereturned count is equal to the length of the list returned by\function{enumerate()}.\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 theyare notified by another thread.\end{funcdesc} \begin{funcdesc}{currentThread}{}Return the current \class{Thread} object, corresponding to thecaller's thread of control.  If the caller's thread of control was notcreated through the\module{threading} module, a dummy thread object with limited functionalityis returned.\end{funcdesc} \begin{funcdesc}{enumerate}{}Return a list of all \class{Thread} objects currently alive.  The listincludes daemonic threads, dummy thread objects created by\function{currentThread()}, and the main thread.  It excludesterminated 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 managesa flag that can be set to true with the \method{set()} method andreset to false with the \method{clear()} method.  The \method{wait()}method blocks until the flag is true.\end{funcdesc} \begin{classdesc*}{local}{}A class that represents thread-local data.  Thread-local data are datawhose values are thread specific.  To manage thread-local data, justcreate an instance of \class{local} (or a subclass) and storeattributes on it: \begin{verbatim}mydata = threading.local()mydata.x = 1\end{verbatim} The instance's values will be different for separate threads. For more details and extensive examples, see the documentation stringof the \module{_threading_local} module. \versionadded{2.4}\end{classdesc*} \begin{funcdesc}{Lock}{}A factory function that returns a new primitive lock object.  Oncea 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 mayacquire it again without blocking; the thread must release it oncefor each time it has acquired it.\end{funcdesc} \begin{funcdesc}{Semaphore}{\optional{value}}A factory function that returns a new semaphore object.  Asemaphore 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 returnwithout making the counter negative.  If not given, \var{value} defaults to1. \end{funcdesc} \begin{funcdesc}{BoundedSemaphore}{\optional{value}}A factory function that returns a new bounded semaphore object.  A boundedsemaphore checks to make sure its current value doesn't exceed its initialvalue.  If it does, \exception{ValueError} is raised. In most situationssemaphores are used to guard resources with limited capacity.  If thesemaphore is released too many times it's a sign of a bug.  If not given,\var{value} defaults to 1. \end{funcdesc} \begin{classdesc*}{Thread}{}A class that represents a thread of control.  This class can be safelysubclassed in a limited fashion.\end{classdesc*} \begin{classdesc*}{Timer}{}A thread that executes a function after a specified interval has passed.\end{classdesc*} \begin{funcdesc}{settrace}{func}Set a trace function\index{trace function} for all threads startedfrom the \module{threading} module.  The \var{func} will be passed to \function{sys.settrace()} for each thread, before its \method{run()}method is called.\versionadded{2.3}\end{funcdesc} \begin{funcdesc}{setprofile}{func}Set a profile function\index{profile function} for all threads startedfrom the \module{threading} module.  The \var{func} will be passed to \function{sys.setprofile()} for each thread, before its \method{run()}method is called.\versionadded{2.3}\end{funcdesc} \begin{funcdesc}{stack_size}{\optional{size}}Return the thread stack size used when creating new threads.  Theoptional \var{size} argument specifies the stack size to be used forsubsequently created threads, and must be 0 (use platform orconfigured default) or a positive integer value of at least 32,768 (32kB).If changing the thread stack size is unsupported, a \exception{ThreadError}is raised.  If the specified stack size is invalid, a \exception{ValueError}is raised and the stack size is unmodified.  32kB is currently the minimumsupported stack size value to guarantee sufficient stack space for theinterpreter itself.  Note that some platforms may have particularrestrictions on values for the stack size, such as requiring a minimumstack size > 32kB or requiring allocation in multiples of the systemmemory page size - platform documentation should be referred to formore information (4kB pages are common; using multiples of 4096 forthe stack size is the suggested approach in the absence of morespecific information).Availability: Windows, systems with \POSIX{} threads.\versionadded{2.5}\end{funcdesc} 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 behaviorof 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 threadscannot be destroyed, stopped, suspended, resumed, or interrupted.  Thestatic methods of Java's Thread class, when implemented, are mapped tomodule-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 ownedby a particular thread when locked.  In Python, it is currentlythe lowest level synchronization primitive available, implementeddirectly 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 isunlocked, \method{acquire()} changes the state to locked and returnsimmediately.  When the state is locked, \method{acquire()} blocksuntil a call to \method{release()} in another thread changes it tounlocked, then the \method{acquire()} call resets it to locked andreturns.  The \method{release()} method should only be called in thelocked state; it changes the state to unlocked and returnsimmediately.  When more than one thread is blocked in\method{acquire()} waiting for the state to turn to unlocked, only onethread proceeds when a \method{release()} call resets the state tounlocked; 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 isunlocked, then set it to locked, and return true.   When invoked with the \var{blocking} argument set to true, do thesame thing as when called without arguments, and return true. When invoked with the \var{blocking} argument set to false, do notblock.  If a call without an argument would block, return falseimmediately; otherwise, do the same thing as when calledwithout arguments, and return true.\end{methoddesc} \begin{methoddesc}{release}{}Release a lock. When the lock is locked, reset it to unlocked, and return.  Ifany other threads are blocked waiting for the lock to becomeunlocked, 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 beacquired multiple times by the same thread.  Internally, it usesthe concepts of ``owning thread'' and ``recursion level'' inaddition to the locked/unlocked state used by primitive locks.  Inthe locked state, some thread owns the lock; in the unlockedstate, no thread owns it. To lock the lock, a thread calls its \method{acquire()} method; thisreturns once the thread owns the lock.  To unlock the lock, athread calls its \method{release()} method.\method{acquire()}/\method{release()} call pairs may be nested; onlythe final \method{release()} (the \method{release()} of the outermostpair) 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 ownsthe lock, increment the recursion level by one, and returnimmediately.  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 therecursion level to one, and return.  If more than one threadis blocked waiting until the lock is unlocked, only one at atime will be able to grab ownership of the lock.  There is noreturn value in this case. When invoked with the \var{blocking} argument set to true, do thesame thing as when called without arguments, and return true. When invoked with the \var{blocking} argument set to false, do notblock.  If a call without an argument would block, return falseimmediately; otherwise, do the same thing as when calledwithout arguments, and return true.\end{methoddesc} \begin{methoddesc}{release}{}Release a lock, decrementing the recursion level.  If after thedecrement it is zero, reset the lock to unlocked (not owned by anythread), and if any other threads are blocked waiting for the lock tobecome unlocked, allow exactly one of them to proceed.  If after thedecrement the recursion level is still nonzero, the lock remainslocked 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.  (Passingone in is useful when several condition variables must share thesame 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 whenthe calling thread has acquired the lock. The \method{wait()} method releases the lock, and then blocks until itis awakened by a \method{notify()} or \method{notifyAll()} call forthe same condition variable in another thread.  Once awakened, itre-acquires the lock and returns.  It is also possible to specify atimeout. The \method{notify()} method wakes up one of the threads waiting forthe 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'trelease the lock; this means that the thread or threads awakened willnot return from their \method{wait()} call immediately, but only whenthe thread that called \method{notify()} or \method{notifyAll()}finally relinquishes ownership of the lock. Tip: the typical programming style using condition variables uses thelock to synchronize access to some shared state; threads that areinterested in a particular change of state call \method{wait()}repeatedly until they see the desired state, while threads that modifythe state call \method{notify()} or \method{notifyAll()} when theychange the state in such a way that it could possibly be a desiredstate for one of the waiters.  For example, the following code is ageneric producer-consumer situation with unlimited buffer capacity: \begin{verbatim}# Consume one itemcv.acquire()while not an_item_is_available():    cv.wait()get_an_available_item()cv.release() # Produce one itemcv.acquire()make_an_item_available()cv.notify()cv.release()\end{verbatim} To choose between \method{notify()} and \method{notifyAll()}, considerwhether one state change can be interesting for only one or severalwaiting threads.  E.g. in a typical producer-consumer situation,adding one item to the buffer only needs to wake up one consumerthread. \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 underlyinglock.  Otherwise, a new \class{RLock} object is created and used asthe underlying lock.\end{classdesc} \begin{methoddesc}{acquire}{*args}Acquire the underlying lock.This method calls the corresponding method on the underlyinglock; 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 underlyinglock; 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 thelock. This method releases the underlying lock, and then blocks until it isawakened by a \method{notify()} or \method{notifyAll()} call for thesame condition variable in another thread, or until the optionaltimeout occurs.  Once awakened or timed out, it re-acquires the lockand returns. When the \var{timeout} argument is present and not \code{None}, itshould be a floating point number specifying a timeout for theoperation in seconds (or fractions thereof). When the underlying lock is an \class{RLock}, it is not released usingits \method{release()} method, since this may not actually unlock thelock when it was acquired multiple times recursively.  Instead, aninternal interface of the \class{RLock} class is used, which reallyunlocks it even when it has been recursively acquired several times.Another internal interface is then used to restore the recursion levelwhen 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 thelock. This method wakes up one of the threads waiting for the conditionvariable, if any are waiting; it is a no-op if no threads are waiting. The current implementation wakes up exactly one thread, if any arewaiting.  However, it's not safe to rely on this behavior.  A future,optimized implementation may occasionally wake up more than onethread. 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 ofcomputer science, invented by the early Dutch computer scientistEdsger 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 threadcalls \method{release()}. \begin{classdesc}{Semaphore}{\optional{value}}The optional argument gives the initial value for the internalcounter; 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 thanzero on entry, decrement it by one and return immediately.  If it iszero on entry, block, waiting until some other thread has called\method{release()} to make it larger than zero.  This is done withproper interlocking so that if multiple \method{acquire()} calls areblocked, \method{release()} will wake exactly one of them up.  Theimplementation may pick one at random, so the order in which blockedthreads are awakened should not be relied on.  There is no returnvalue in this case. When invoked with \var{blocking} set to true, do the same thing aswhen called without arguments, and return true. When invoked with \var{blocking} set to false, do not block.  If acall without an argument would block, return false immediately;otherwise, do the same thing as when called without arguments, andreturn true.\end{methoddesc} \begin{methoddesc}{release}{}Release a semaphore,incrementing the internal counter by one.  When it was zero onentry and another thread is waiting for it to become largerthan zero again, wake up that thread.\end{methoddesc}  \subsubsection{\class{Semaphore} Example \label{semaphore-examples}} Semaphores are often used to guard resources with limited capacity, forexample, a database server.  In any situation where the size of the resourcesize is fixed, you should use a bounded semaphore.  Before spawning anyworker threads, your main thread would initialize the semaphore: \begin{verbatim}maxconnections = 5...pool_sema = BoundedSemaphore(value=maxconnections)\end{verbatim} Once spawned, worker threads call the semaphore's acquire and releasemethods when they need to connect to the server: \begin{verbatim}pool_sema.acquire()conn = connectdb()... use connection ...conn.close()pool_sema.release()\end{verbatim} The use of a bounded semaphore reduces the chance that a programming errorwhich causes the semaphore to be released more than it's acquired will goundetected.  \subsection{Event Objects \label{event-objects}} This is one of the simplest mechanisms for communication betweenthreads: one thread signals an event and other threads wait for it. An event object manages an internal flag that can be set to true withthe \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 blockat 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} 

Lines 1–500 of 716.