blob: e85e269662e54d095fc7d7c32acd19a835dd5891 [file] [log] [blame]
Jeremy Hylton92bb6e72002-08-14 19:25:42 +00001"""Thread module emulating a subset of Java's threading model."""
Guido van Rossum7f5013a1998-04-09 22:01:42 +00002
Fred Drakea8725952002-12-30 23:32:50 +00003import sys as _sys
Georg Brandl2067bfd2008-05-25 13:05:15 +00004import _thread
Fred Drakea8725952002-12-30 23:32:50 +00005
Fred Drakea8725952002-12-30 23:32:50 +00006from time import time as _time, sleep as _sleep
Neil Schemenauerf607fc52003-11-05 23:03:00 +00007from traceback import format_exc as _format_exc
Raymond Hettinger756b3f32004-01-29 06:37:52 +00008from collections import deque
Antoine Pitrouc081c0c2011-07-15 22:12:24 +02009from _weakrefset import WeakSet
Guido van Rossum7f5013a1998-04-09 22:01:42 +000010
Benjamin Petersonb3085c92008-09-01 23:09:31 +000011# Note regarding PEP 8 compliant names
12# This threading model was originally inspired by Java, and inherited
13# the convention of camelCase function and method names from that
14# language. Those originaly names are not in any imminent danger of
15# being deprecated (even for Py3k),so this module provides them as an
16# alias for the PEP 8 compliant names
17# Note that using the new PEP 8 compliant names facilitates substitution
18# with the multiprocessing module, which doesn't provide the old
19# Java inspired names.
20
Benjamin Peterson672b8032008-06-11 19:14:14 +000021__all__ = ['active_count', 'Condition', 'current_thread', 'enumerate', 'Event',
Raymond Hettinger5cee47f2011-01-11 19:59:46 +000022 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', 'Barrier',
Benjamin Peterson7761b952011-08-02 13:05:47 -050023 'Timer', 'ThreadError', 'setprofile', 'settrace', 'local', 'stack_size']
Guido van Rossum7f5013a1998-04-09 22:01:42 +000024
Raymond Hettinger5cee47f2011-01-11 19:59:46 +000025# Rename some stuff so "from threading import *" is safe
Georg Brandl2067bfd2008-05-25 13:05:15 +000026_start_new_thread = _thread.start_new_thread
27_allocate_lock = _thread.allocate_lock
Victor Stinner2a129742011-05-30 23:02:52 +020028get_ident = _thread.get_ident
Georg Brandl2067bfd2008-05-25 13:05:15 +000029ThreadError = _thread.error
Antoine Pitrou434736a2009-11-10 18:46:01 +000030try:
31 _CRLock = _thread.RLock
32except AttributeError:
33 _CRLock = None
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000034TIMEOUT_MAX = _thread.TIMEOUT_MAX
Georg Brandl2067bfd2008-05-25 13:05:15 +000035del _thread
Guido van Rossum7f5013a1998-04-09 22:01:42 +000036
Guido van Rossum7f5013a1998-04-09 22:01:42 +000037
Tim Peters59aba122003-07-01 20:01:55 +000038# Debug support (adapted from ihooks.py).
Guido van Rossum7f5013a1998-04-09 22:01:42 +000039
Tim Peters0939fac2003-07-01 19:28:44 +000040_VERBOSE = False
Guido van Rossum7f5013a1998-04-09 22:01:42 +000041
42if __debug__:
43
Tim Peters59aba122003-07-01 20:01:55 +000044 class _Verbose(object):
Guido van Rossum7f5013a1998-04-09 22:01:42 +000045
46 def __init__(self, verbose=None):
47 if verbose is None:
48 verbose = _VERBOSE
Guido van Rossumd0648992007-08-20 19:25:41 +000049 self._verbose = verbose
Guido van Rossum7f5013a1998-04-09 22:01:42 +000050
51 def _note(self, format, *args):
Guido van Rossumd0648992007-08-20 19:25:41 +000052 if self._verbose:
Guido van Rossum7f5013a1998-04-09 22:01:42 +000053 format = format % args
Antoine Pitrou401edd62010-12-17 17:42:16 +000054 # Issue #4188: calling current_thread() can incur an infinite
55 # recursion if it has to create a DummyThread on the fly.
Victor Stinner2a129742011-05-30 23:02:52 +020056 ident = get_ident()
Antoine Pitrou401edd62010-12-17 17:42:16 +000057 try:
58 name = _active[ident].name
59 except KeyError:
60 name = "<OS thread %d>" % ident
61 format = "%s: %s\n" % (name, format)
Guido van Rossum7f5013a1998-04-09 22:01:42 +000062 _sys.stderr.write(format)
63
64else:
65 # Disable this when using "python -O"
Tim Peters59aba122003-07-01 20:01:55 +000066 class _Verbose(object):
Guido van Rossum7f5013a1998-04-09 22:01:42 +000067 def __init__(self, verbose=None):
68 pass
69 def _note(self, *args):
70 pass
71
Jeremy Hyltonbfccb352003-06-29 16:58:41 +000072# Support for profile and trace hooks
73
74_profile_hook = None
75_trace_hook = None
76
77def setprofile(func):
78 global _profile_hook
79 _profile_hook = func
Tim Petersd1b108b2003-06-29 17:24:17 +000080
Jeremy Hyltonbfccb352003-06-29 16:58:41 +000081def settrace(func):
82 global _trace_hook
83 _trace_hook = func
Guido van Rossum7f5013a1998-04-09 22:01:42 +000084
85# Synchronization classes
86
87Lock = _allocate_lock
88
Antoine Pitrou434736a2009-11-10 18:46:01 +000089def RLock(verbose=None, *args, **kwargs):
90 if verbose is None:
91 verbose = _VERBOSE
92 if (__debug__ and verbose) or _CRLock is None:
93 return _PyRLock(verbose, *args, **kwargs)
94 return _CRLock(*args, **kwargs)
Guido van Rossum7f5013a1998-04-09 22:01:42 +000095
96class _RLock(_Verbose):
Tim Petersb90f89a2001-01-15 03:26:36 +000097
Guido van Rossum7f5013a1998-04-09 22:01:42 +000098 def __init__(self, verbose=None):
99 _Verbose.__init__(self, verbose)
Guido van Rossumd0648992007-08-20 19:25:41 +0000100 self._block = _allocate_lock()
101 self._owner = None
102 self._count = 0
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000103
104 def __repr__(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000105 owner = self._owner
Antoine Pitroub0872682009-11-09 16:08:16 +0000106 try:
107 owner = _active[owner].name
108 except KeyError:
109 pass
110 return "<%s owner=%r count=%d>" % (
111 self.__class__.__name__, owner, self._count)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000112
Antoine Pitrou7c3e5772010-04-14 15:44:10 +0000113 def acquire(self, blocking=True, timeout=-1):
Victor Stinner2a129742011-05-30 23:02:52 +0200114 me = get_ident()
Antoine Pitroub0872682009-11-09 16:08:16 +0000115 if self._owner == me:
Guido van Rossumd0648992007-08-20 19:25:41 +0000116 self._count = self._count + 1
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000117 if __debug__:
118 self._note("%s.acquire(%s): recursive success", self, blocking)
119 return 1
Antoine Pitrou7c3e5772010-04-14 15:44:10 +0000120 rc = self._block.acquire(blocking, timeout)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000121 if rc:
Guido van Rossumd0648992007-08-20 19:25:41 +0000122 self._owner = me
123 self._count = 1
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000124 if __debug__:
Brett Cannon90cece72005-01-27 22:48:30 +0000125 self._note("%s.acquire(%s): initial success", self, blocking)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000126 else:
127 if __debug__:
128 self._note("%s.acquire(%s): failure", self, blocking)
129 return rc
130
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000131 __enter__ = acquire
132
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000133 def release(self):
Victor Stinner2a129742011-05-30 23:02:52 +0200134 if self._owner != get_ident():
Georg Brandl495f7b52009-10-27 15:28:25 +0000135 raise RuntimeError("cannot release un-acquired lock")
Guido van Rossumd0648992007-08-20 19:25:41 +0000136 self._count = count = self._count - 1
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000137 if not count:
Guido van Rossumd0648992007-08-20 19:25:41 +0000138 self._owner = None
139 self._block.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000140 if __debug__:
141 self._note("%s.release(): final release", self)
142 else:
143 if __debug__:
144 self._note("%s.release(): non-final release", self)
145
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000146 def __exit__(self, t, v, tb):
147 self.release()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000148
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000149 # Internal methods used by condition variables
150
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000151 def _acquire_restore(self, state):
Guido van Rossumd0648992007-08-20 19:25:41 +0000152 self._block.acquire()
153 self._count, self._owner = state
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000154 if __debug__:
155 self._note("%s._acquire_restore()", self)
156
157 def _release_save(self):
158 if __debug__:
159 self._note("%s._release_save()", self)
Victor Stinnerc2824d42011-04-24 23:41:33 +0200160 if self._count == 0:
161 raise RuntimeError("cannot release un-acquired lock")
Guido van Rossumd0648992007-08-20 19:25:41 +0000162 count = self._count
163 self._count = 0
164 owner = self._owner
165 self._owner = None
166 self._block.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000167 return (count, owner)
168
169 def _is_owned(self):
Victor Stinner2a129742011-05-30 23:02:52 +0200170 return self._owner == get_ident()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000171
Antoine Pitrou434736a2009-11-10 18:46:01 +0000172_PyRLock = _RLock
173
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000174
Éric Araujo0cdd4452011-07-28 00:28:28 +0200175class Condition(_Verbose):
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000176
177 def __init__(self, lock=None, verbose=None):
178 _Verbose.__init__(self, verbose)
179 if lock is None:
180 lock = RLock()
Guido van Rossumd0648992007-08-20 19:25:41 +0000181 self._lock = lock
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000182 # Export the lock's acquire() and release() methods
183 self.acquire = lock.acquire
184 self.release = lock.release
185 # If the lock defines _release_save() and/or _acquire_restore(),
186 # these override the default implementations (which just call
187 # release() and acquire() on the lock). Ditto for _is_owned().
188 try:
189 self._release_save = lock._release_save
190 except AttributeError:
191 pass
192 try:
193 self._acquire_restore = lock._acquire_restore
194 except AttributeError:
195 pass
196 try:
197 self._is_owned = lock._is_owned
198 except AttributeError:
199 pass
Guido van Rossumd0648992007-08-20 19:25:41 +0000200 self._waiters = []
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000201
Thomas Wouters477c8d52006-05-27 19:21:47 +0000202 def __enter__(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000203 return self._lock.__enter__()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000204
Thomas Wouters477c8d52006-05-27 19:21:47 +0000205 def __exit__(self, *args):
Guido van Rossumd0648992007-08-20 19:25:41 +0000206 return self._lock.__exit__(*args)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000207
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000208 def __repr__(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000209 return "<Condition(%s, %d)>" % (self._lock, len(self._waiters))
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000210
211 def _release_save(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000212 self._lock.release() # No state to save
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000213
214 def _acquire_restore(self, x):
Guido van Rossumd0648992007-08-20 19:25:41 +0000215 self._lock.acquire() # Ignore saved state
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000216
217 def _is_owned(self):
Benjamin Peterson672b8032008-06-11 19:14:14 +0000218 # Return True if lock is owned by current_thread.
Jeremy Hyltonaf7fde72002-08-14 17:43:59 +0000219 # This method is called only if __lock doesn't have _is_owned().
Guido van Rossumd0648992007-08-20 19:25:41 +0000220 if self._lock.acquire(0):
221 self._lock.release()
Tim Petersbc0e9102002-04-04 22:55:58 +0000222 return False
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000223 else:
Tim Petersbc0e9102002-04-04 22:55:58 +0000224 return True
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000225
226 def wait(self, timeout=None):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000227 if not self._is_owned():
Georg Brandl495f7b52009-10-27 15:28:25 +0000228 raise RuntimeError("cannot wait on un-acquired lock")
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000229 waiter = _allocate_lock()
230 waiter.acquire()
Guido van Rossumd0648992007-08-20 19:25:41 +0000231 self._waiters.append(waiter)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000232 saved_state = self._release_save()
Tim Petersc951bf92001-04-02 20:15:57 +0000233 try: # restore state no matter what (e.g., KeyboardInterrupt)
234 if timeout is None:
235 waiter.acquire()
Georg Brandlb9a43912010-10-28 09:03:20 +0000236 gotit = True
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000237 if __debug__:
Tim Petersc951bf92001-04-02 20:15:57 +0000238 self._note("%s.wait(): got it", self)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000239 else:
Antoine Pitrou7c3e5772010-04-14 15:44:10 +0000240 if timeout > 0:
241 gotit = waiter.acquire(True, timeout)
242 else:
243 gotit = waiter.acquire(False)
Tim Petersc951bf92001-04-02 20:15:57 +0000244 if not gotit:
245 if __debug__:
246 self._note("%s.wait(%s): timed out", self, timeout)
247 try:
Guido van Rossumd0648992007-08-20 19:25:41 +0000248 self._waiters.remove(waiter)
Tim Petersc951bf92001-04-02 20:15:57 +0000249 except ValueError:
250 pass
251 else:
252 if __debug__:
253 self._note("%s.wait(%s): got it", self, timeout)
Georg Brandlb9a43912010-10-28 09:03:20 +0000254 return gotit
Tim Petersc951bf92001-04-02 20:15:57 +0000255 finally:
256 self._acquire_restore(saved_state)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000257
Kristján Valur Jónsson63315202010-11-18 12:46:39 +0000258 def wait_for(self, predicate, timeout=None):
259 endtime = None
260 waittime = timeout
261 result = predicate()
262 while not result:
263 if waittime is not None:
264 if endtime is None:
265 endtime = _time() + waittime
266 else:
267 waittime = endtime - _time()
268 if waittime <= 0:
269 if __debug__:
270 self._note("%s.wait_for(%r, %r): Timed out.",
271 self, predicate, timeout)
272 break
273 if __debug__:
274 self._note("%s.wait_for(%r, %r): Waiting with timeout=%s.",
275 self, predicate, timeout, waittime)
276 self.wait(waittime)
277 result = predicate()
278 else:
279 if __debug__:
280 self._note("%s.wait_for(%r, %r): Success.",
281 self, predicate, timeout)
282 return result
283
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000284 def notify(self, n=1):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000285 if not self._is_owned():
Georg Brandl495f7b52009-10-27 15:28:25 +0000286 raise RuntimeError("cannot notify on un-acquired lock")
Guido van Rossumd0648992007-08-20 19:25:41 +0000287 __waiters = self._waiters
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000288 waiters = __waiters[:n]
289 if not waiters:
290 if __debug__:
291 self._note("%s.notify(): no waiters", self)
292 return
293 self._note("%s.notify(): notifying %d waiter%s", self, n,
294 n!=1 and "s" or "")
295 for waiter in waiters:
296 waiter.release()
297 try:
298 __waiters.remove(waiter)
299 except ValueError:
300 pass
301
Benjamin Peterson672b8032008-06-11 19:14:14 +0000302 def notify_all(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000303 self.notify(len(self._waiters))
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000304
Benjamin Petersonb3085c92008-09-01 23:09:31 +0000305 notifyAll = notify_all
306
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000307
Éric Araujo0cdd4452011-07-28 00:28:28 +0200308class Semaphore(_Verbose):
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000309
Andrew M. Kuchling39d3bfc2000-02-29 00:10:24 +0000310 # After Tim Peters' semaphore class, but not quite the same (no maximum)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000311
312 def __init__(self, value=1, verbose=None):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000313 if value < 0:
314 raise ValueError("semaphore initial value must be >= 0")
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000315 _Verbose.__init__(self, verbose)
Guido van Rossumd0648992007-08-20 19:25:41 +0000316 self._cond = Condition(Lock())
317 self._value = value
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000318
Antoine Pitrou0454af92010-04-17 23:51:58 +0000319 def acquire(self, blocking=True, timeout=None):
320 if not blocking and timeout is not None:
321 raise ValueError("can't specify timeout for non-blocking acquire")
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000322 rc = False
Antoine Pitrou0454af92010-04-17 23:51:58 +0000323 endtime = None
Guido van Rossumd0648992007-08-20 19:25:41 +0000324 self._cond.acquire()
325 while self._value == 0:
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000326 if not blocking:
327 break
Skip Montanarob446fc72001-08-19 04:25:24 +0000328 if __debug__:
329 self._note("%s.acquire(%s): blocked waiting, value=%s",
Guido van Rossumd0648992007-08-20 19:25:41 +0000330 self, blocking, self._value)
Antoine Pitrou0454af92010-04-17 23:51:58 +0000331 if timeout is not None:
332 if endtime is None:
333 endtime = _time() + timeout
334 else:
335 timeout = endtime - _time()
336 if timeout <= 0:
337 break
338 self._cond.wait(timeout)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000339 else:
Guido van Rossumd0648992007-08-20 19:25:41 +0000340 self._value = self._value - 1
Skip Montanarob446fc72001-08-19 04:25:24 +0000341 if __debug__:
Skip Montanaroae8454a2001-08-19 05:53:47 +0000342 self._note("%s.acquire: success, value=%s",
Guido van Rossumd0648992007-08-20 19:25:41 +0000343 self, self._value)
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000344 rc = True
Guido van Rossumd0648992007-08-20 19:25:41 +0000345 self._cond.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000346 return rc
347
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000348 __enter__ = acquire
349
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000350 def release(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000351 self._cond.acquire()
352 self._value = self._value + 1
Skip Montanarob446fc72001-08-19 04:25:24 +0000353 if __debug__:
Skip Montanaroae8454a2001-08-19 05:53:47 +0000354 self._note("%s.release: success, value=%s",
Guido van Rossumd0648992007-08-20 19:25:41 +0000355 self, self._value)
356 self._cond.notify()
357 self._cond.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000358
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000359 def __exit__(self, t, v, tb):
360 self.release()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000361
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000362
Éric Araujo0cdd4452011-07-28 00:28:28 +0200363class BoundedSemaphore(Semaphore):
Skip Montanaroe428bb72001-08-20 20:27:58 +0000364 """Semaphore that checks that # releases is <= # acquires"""
365 def __init__(self, value=1, verbose=None):
Éric Araujo0cdd4452011-07-28 00:28:28 +0200366 Semaphore.__init__(self, value, verbose)
Skip Montanaroe428bb72001-08-20 20:27:58 +0000367 self._initial_value = value
368
369 def release(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000370 if self._value >= self._initial_value:
Collin Winterce36ad82007-08-30 01:19:48 +0000371 raise ValueError("Semaphore released too many times")
Éric Araujo0cdd4452011-07-28 00:28:28 +0200372 return Semaphore.release(self)
Skip Montanaroe428bb72001-08-20 20:27:58 +0000373
374
Éric Araujo0cdd4452011-07-28 00:28:28 +0200375class Event(_Verbose):
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000376
377 # After Tim Peters' event class (without is_posted())
378
379 def __init__(self, verbose=None):
380 _Verbose.__init__(self, verbose)
Guido van Rossumd0648992007-08-20 19:25:41 +0000381 self._cond = Condition(Lock())
382 self._flag = False
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000383
Gregory P. Smith9bd4a242011-01-04 18:33:38 +0000384 def _reset_internal_locks(self):
385 # private! called by Thread._reset_internal_locks by _after_fork()
386 self._cond.__init__()
387
Benjamin Peterson672b8032008-06-11 19:14:14 +0000388 def is_set(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000389 return self._flag
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000390
Benjamin Petersonb3085c92008-09-01 23:09:31 +0000391 isSet = is_set
Benjamin Petersonf0923f52008-08-18 22:10:13 +0000392
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000393 def set(self):
Christian Heimes969fe572008-01-25 11:23:10 +0000394 self._cond.acquire()
395 try:
Guido van Rossumd0648992007-08-20 19:25:41 +0000396 self._flag = True
Benjamin Peterson672b8032008-06-11 19:14:14 +0000397 self._cond.notify_all()
Christian Heimes969fe572008-01-25 11:23:10 +0000398 finally:
399 self._cond.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000400
401 def clear(self):
Christian Heimes969fe572008-01-25 11:23:10 +0000402 self._cond.acquire()
403 try:
Guido van Rossumd0648992007-08-20 19:25:41 +0000404 self._flag = False
Christian Heimes969fe572008-01-25 11:23:10 +0000405 finally:
406 self._cond.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000407
408 def wait(self, timeout=None):
Christian Heimes969fe572008-01-25 11:23:10 +0000409 self._cond.acquire()
410 try:
Charles-François Natalided03482012-01-07 18:24:56 +0100411 signaled = self._flag
412 if not signaled:
413 signaled = self._cond.wait(timeout)
414 return signaled
Christian Heimes969fe572008-01-25 11:23:10 +0000415 finally:
416 self._cond.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000417
Kristján Valur Jónsson3be00032010-10-28 09:43:10 +0000418
419# A barrier class. Inspired in part by the pthread_barrier_* api and
420# the CyclicBarrier class from Java. See
421# http://sourceware.org/pthreads-win32/manual/pthread_barrier_init.html and
422# http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/
423# CyclicBarrier.html
424# for information.
425# We maintain two main states, 'filling' and 'draining' enabling the barrier
426# to be cyclic. Threads are not allowed into it until it has fully drained
427# since the previous cycle. In addition, a 'resetting' state exists which is
428# similar to 'draining' except that threads leave with a BrokenBarrierError,
Ezio Melottie130a522011-10-19 10:58:56 +0300429# and a 'broken' state in which all threads get the exception.
Kristján Valur Jónsson3be00032010-10-28 09:43:10 +0000430class Barrier(_Verbose):
431 """
432 Barrier. Useful for synchronizing a fixed number of threads
433 at known synchronization points. Threads block on 'wait()' and are
434 simultaneously once they have all made that call.
435 """
436 def __init__(self, parties, action=None, timeout=None, verbose=None):
437 """
438 Create a barrier, initialised to 'parties' threads.
439 'action' is a callable which, when supplied, will be called
440 by one of the threads after they have all entered the
441 barrier and just prior to releasing them all.
442 If a 'timeout' is provided, it is uses as the default for
443 all subsequent 'wait()' calls.
444 """
445 _Verbose.__init__(self, verbose)
446 self._cond = Condition(Lock())
447 self._action = action
448 self._timeout = timeout
449 self._parties = parties
450 self._state = 0 #0 filling, 1, draining, -1 resetting, -2 broken
451 self._count = 0
452
453 def wait(self, timeout=None):
454 """
455 Wait for the barrier. When the specified number of threads have
456 started waiting, they are all simultaneously awoken. If an 'action'
457 was provided for the barrier, one of the threads will have executed
458 that callback prior to returning.
459 Returns an individual index number from 0 to 'parties-1'.
460 """
461 if timeout is None:
462 timeout = self._timeout
463 with self._cond:
464 self._enter() # Block while the barrier drains.
465 index = self._count
466 self._count += 1
467 try:
468 if index + 1 == self._parties:
469 # We release the barrier
470 self._release()
471 else:
472 # We wait until someone releases us
473 self._wait(timeout)
474 return index
475 finally:
476 self._count -= 1
477 # Wake up any threads waiting for barrier to drain.
478 self._exit()
479
480 # Block until the barrier is ready for us, or raise an exception
481 # if it is broken.
482 def _enter(self):
483 while self._state in (-1, 1):
484 # It is draining or resetting, wait until done
485 self._cond.wait()
486 #see if the barrier is in a broken state
487 if self._state < 0:
488 raise BrokenBarrierError
489 assert self._state == 0
490
491 # Optionally run the 'action' and release the threads waiting
492 # in the barrier.
493 def _release(self):
494 try:
495 if self._action:
496 self._action()
497 # enter draining state
498 self._state = 1
499 self._cond.notify_all()
500 except:
501 #an exception during the _action handler. Break and reraise
502 self._break()
503 raise
504
505 # Wait in the barrier until we are relased. Raise an exception
506 # if the barrier is reset or broken.
507 def _wait(self, timeout):
Kristján Valur Jónsson63315202010-11-18 12:46:39 +0000508 if not self._cond.wait_for(lambda : self._state != 0, timeout):
509 #timed out. Break the barrier
510 self._break()
511 raise BrokenBarrierError
512 if self._state < 0:
513 raise BrokenBarrierError
Kristján Valur Jónsson3be00032010-10-28 09:43:10 +0000514 assert self._state == 1
515
516 # If we are the last thread to exit the barrier, signal any threads
517 # waiting for the barrier to drain.
518 def _exit(self):
519 if self._count == 0:
520 if self._state in (-1, 1):
521 #resetting or draining
522 self._state = 0
523 self._cond.notify_all()
524
525 def reset(self):
526 """
527 Reset the barrier to the initial state.
528 Any threads currently waiting will get the BrokenBarrier exception
529 raised.
530 """
531 with self._cond:
532 if self._count > 0:
533 if self._state == 0:
534 #reset the barrier, waking up threads
535 self._state = -1
536 elif self._state == -2:
537 #was broken, set it to reset state
538 #which clears when the last thread exits
539 self._state = -1
540 else:
541 self._state = 0
542 self._cond.notify_all()
543
544 def abort(self):
545 """
546 Place the barrier into a 'broken' state.
547 Useful in case of error. Any currently waiting threads and
548 threads attempting to 'wait()' will have BrokenBarrierError
549 raised.
550 """
551 with self._cond:
552 self._break()
553
554 def _break(self):
555 # An internal error was detected. The barrier is set to
556 # a broken state all parties awakened.
557 self._state = -2
558 self._cond.notify_all()
559
560 @property
561 def parties(self):
562 """
563 Return the number of threads required to trip the barrier.
564 """
565 return self._parties
566
567 @property
568 def n_waiting(self):
569 """
570 Return the number of threads that are currently waiting at the barrier.
571 """
572 # We don't need synchronization here since this is an ephemeral result
573 # anyway. It returns the correct value in the steady state.
574 if self._state == 0:
575 return self._count
576 return 0
577
578 @property
579 def broken(self):
580 """
581 Return True if the barrier is in a broken state
582 """
583 return self._state == -2
584
585#exception raised by the Barrier class
586class BrokenBarrierError(RuntimeError): pass
587
588
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000589# Helper to generate new thread names
590_counter = 0
591def _newname(template="Thread-%d"):
592 global _counter
593 _counter = _counter + 1
594 return template % _counter
595
596# Active thread administration
597_active_limbo_lock = _allocate_lock()
Tim Peters711906e2005-01-08 07:30:42 +0000598_active = {} # maps thread id to Thread object
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000599_limbo = {}
600
Antoine Pitrouc081c0c2011-07-15 22:12:24 +0200601# For debug and leak testing
602_dangling = WeakSet()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000603
604# Main class for threads
605
606class Thread(_Verbose):
607
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000608 __initialized = False
Brett Cannoncc4e9352004-07-03 03:52:35 +0000609 # Need to store a reference to sys.exc_info for printing
610 # out exceptions when a thread tries to use a global var. during interp.
611 # shutdown and thus raises an exception about trying to perform some
612 # operation on/with a NoneType
613 __exc_info = _sys.exc_info
Christian Heimesbbe741d2008-03-28 10:53:29 +0000614 # Keep sys.exc_clear too to clear the exception just before
615 # allowing .join() to return.
616 #XXX __exc_clear = _sys.exc_clear
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000617
618 def __init__(self, group=None, target=None, name=None,
Antoine Pitrou0bd4deb2011-02-25 22:07:43 +0000619 args=(), kwargs=None, verbose=None, *, daemon=None):
Guido van Rossum5a43e1a1998-06-09 19:04:26 +0000620 assert group is None, "group argument must be None for now"
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000621 _Verbose.__init__(self, verbose)
Georg Brandla4a8b822005-07-15 09:13:21 +0000622 if kwargs is None:
623 kwargs = {}
Guido van Rossumd0648992007-08-20 19:25:41 +0000624 self._target = target
625 self._name = str(name or _newname())
626 self._args = args
627 self._kwargs = kwargs
Antoine Pitrou0bd4deb2011-02-25 22:07:43 +0000628 if daemon is not None:
629 self._daemonic = daemon
630 else:
631 self._daemonic = current_thread().daemon
Georg Brandl0c77a822008-06-10 16:37:50 +0000632 self._ident = None
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000633 self._started = Event()
Guido van Rossumd0648992007-08-20 19:25:41 +0000634 self._stopped = False
635 self._block = Condition(Lock())
636 self._initialized = True
Brett Cannoncc4e9352004-07-03 03:52:35 +0000637 # sys.stderr is not stored in the class like
638 # sys.exc_info since it can be changed between instances
Guido van Rossumd0648992007-08-20 19:25:41 +0000639 self._stderr = _sys.stderr
Antoine Pitrouc081c0c2011-07-15 22:12:24 +0200640 _dangling.add(self)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000641
Gregory P. Smith9bd4a242011-01-04 18:33:38 +0000642 def _reset_internal_locks(self):
643 # private! Called by _after_fork() to reset our internal locks as
644 # they may be in an invalid state leading to a deadlock or crash.
645 if hasattr(self, '_block'): # DummyThread deletes _block
646 self._block.__init__()
647 self._started._reset_internal_locks()
648
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000649 def __repr__(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000650 assert self._initialized, "Thread.__init__() was not called"
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000651 status = "initial"
Benjamin Peterson672b8032008-06-11 19:14:14 +0000652 if self._started.is_set():
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000653 status = "started"
Guido van Rossumd0648992007-08-20 19:25:41 +0000654 if self._stopped:
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000655 status = "stopped"
Guido van Rossumd0648992007-08-20 19:25:41 +0000656 if self._daemonic:
Georg Brandl0c77a822008-06-10 16:37:50 +0000657 status += " daemon"
658 if self._ident is not None:
659 status += " %s" % self._ident
Guido van Rossumd0648992007-08-20 19:25:41 +0000660 return "<%s(%s, %s)>" % (self.__class__.__name__, self._name, status)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000661
662 def start(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000663 if not self._initialized:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000664 raise RuntimeError("thread.__init__() not called")
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000665
Benjamin Peterson672b8032008-06-11 19:14:14 +0000666 if self._started.is_set():
Senthil Kumaranfdd4d0f2010-04-06 03:30:18 +0000667 raise RuntimeError("threads can only be started once")
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000668 if __debug__:
669 self._note("%s.start(): starting thread", self)
Benjamin Petersond23f8222009-04-05 19:13:16 +0000670 with _active_limbo_lock:
671 _limbo[self] = self
Gregory P. Smith3fdd9642010-02-28 18:57:46 +0000672 try:
673 _start_new_thread(self._bootstrap, ())
674 except Exception:
675 with _active_limbo_lock:
676 del _limbo[self]
677 raise
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000678 self._started.wait()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000679
680 def run(self):
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000681 try:
682 if self._target:
683 self._target(*self._args, **self._kwargs)
684 finally:
685 # Avoid a refcycle if the thread is running a function with
686 # an argument that has a member that points to the thread.
687 del self._target, self._args, self._kwargs
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000688
Guido van Rossumd0648992007-08-20 19:25:41 +0000689 def _bootstrap(self):
Guido van Rossum61e21b52007-08-20 19:06:03 +0000690 # Wrapper around the real bootstrap code that ignores
691 # exceptions during interpreter cleanup. Those typically
692 # happen when a daemon thread wakes up at an unfortunate
693 # moment, finds the world around it destroyed, and raises some
694 # random exception *** while trying to report the exception in
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000695 # _bootstrap_inner() below ***. Those random exceptions
Guido van Rossum61e21b52007-08-20 19:06:03 +0000696 # don't help anybody, and they confuse users, so we suppress
697 # them. We suppress them only when it appears that the world
698 # indeed has already been destroyed, so that exceptions in
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000699 # _bootstrap_inner() during normal business hours are properly
Guido van Rossum61e21b52007-08-20 19:06:03 +0000700 # reported. Also, we only suppress them for daemonic threads;
701 # if a non-daemonic encounters this, something else is wrong.
702 try:
Guido van Rossumd0648992007-08-20 19:25:41 +0000703 self._bootstrap_inner()
Guido van Rossum61e21b52007-08-20 19:06:03 +0000704 except:
Guido van Rossumd0648992007-08-20 19:25:41 +0000705 if self._daemonic and _sys is None:
Guido van Rossum61e21b52007-08-20 19:06:03 +0000706 return
707 raise
708
Benjamin Petersond23f8222009-04-05 19:13:16 +0000709 def _set_ident(self):
Victor Stinner2a129742011-05-30 23:02:52 +0200710 self._ident = get_ident()
Benjamin Petersond23f8222009-04-05 19:13:16 +0000711
Guido van Rossumd0648992007-08-20 19:25:41 +0000712 def _bootstrap_inner(self):
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000713 try:
Benjamin Petersond23f8222009-04-05 19:13:16 +0000714 self._set_ident()
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000715 self._started.set()
Benjamin Petersond23f8222009-04-05 19:13:16 +0000716 with _active_limbo_lock:
717 _active[self._ident] = self
718 del _limbo[self]
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000719 if __debug__:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000720 self._note("%s._bootstrap(): thread started", self)
Jeremy Hyltonbfccb352003-06-29 16:58:41 +0000721
722 if _trace_hook:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000723 self._note("%s._bootstrap(): registering trace hook", self)
Jeremy Hyltonbfccb352003-06-29 16:58:41 +0000724 _sys.settrace(_trace_hook)
725 if _profile_hook:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000726 self._note("%s._bootstrap(): registering profile hook", self)
Jeremy Hyltonbfccb352003-06-29 16:58:41 +0000727 _sys.setprofile(_profile_hook)
Tim Petersd1b108b2003-06-29 17:24:17 +0000728
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000729 try:
730 self.run()
731 except SystemExit:
732 if __debug__:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000733 self._note("%s._bootstrap(): raised SystemExit", self)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000734 except:
735 if __debug__:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000736 self._note("%s._bootstrap(): unhandled exception", self)
Brett Cannoncc4e9352004-07-03 03:52:35 +0000737 # If sys.stderr is no more (most likely from interpreter
Guido van Rossumd0648992007-08-20 19:25:41 +0000738 # shutdown) use self._stderr. Otherwise still use sys (as in
Brett Cannoncc4e9352004-07-03 03:52:35 +0000739 # _sys) in case sys.stderr was redefined since the creation of
740 # self.
741 if _sys:
742 _sys.stderr.write("Exception in thread %s:\n%s\n" %
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000743 (self.name, _format_exc()))
Brett Cannoncc4e9352004-07-03 03:52:35 +0000744 else:
745 # Do the best job possible w/o a huge amt. of code to
746 # approximate a traceback (code ideas from
747 # Lib/traceback.py)
Guido van Rossumd0648992007-08-20 19:25:41 +0000748 exc_type, exc_value, exc_tb = self._exc_info()
Brett Cannoncc4e9352004-07-03 03:52:35 +0000749 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000750 print((
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000751 "Exception in thread " + self.name +
Guido van Rossumd0648992007-08-20 19:25:41 +0000752 " (most likely raised during interpreter shutdown):"), file=self._stderr)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000753 print((
Guido van Rossumd0648992007-08-20 19:25:41 +0000754 "Traceback (most recent call last):"), file=self._stderr)
Brett Cannoncc4e9352004-07-03 03:52:35 +0000755 while exc_tb:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000756 print((
Brett Cannoncc4e9352004-07-03 03:52:35 +0000757 ' File "%s", line %s, in %s' %
758 (exc_tb.tb_frame.f_code.co_filename,
759 exc_tb.tb_lineno,
Guido van Rossumd0648992007-08-20 19:25:41 +0000760 exc_tb.tb_frame.f_code.co_name)), file=self._stderr)
Brett Cannoncc4e9352004-07-03 03:52:35 +0000761 exc_tb = exc_tb.tb_next
Guido van Rossumd0648992007-08-20 19:25:41 +0000762 print(("%s: %s" % (exc_type, exc_value)), file=self._stderr)
Brett Cannoncc4e9352004-07-03 03:52:35 +0000763 # Make sure that exc_tb gets deleted since it is a memory
764 # hog; deleting everything else is just for thoroughness
765 finally:
766 del exc_type, exc_value, exc_tb
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000767 else:
768 if __debug__:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000769 self._note("%s._bootstrap(): normal return", self)
Christian Heimesbbe741d2008-03-28 10:53:29 +0000770 finally:
771 # Prevent a race in
772 # test_threading.test_no_refcycle_through_target when
773 # the exception keeps the target alive past when we
774 # assert that it's dead.
775 #XXX self.__exc_clear()
776 pass
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000777 finally:
Christian Heimes1af737c2008-01-23 08:24:23 +0000778 with _active_limbo_lock:
779 self._stop()
780 try:
Georg Brandl0c77a822008-06-10 16:37:50 +0000781 # We don't call self._delete() because it also
Christian Heimes1af737c2008-01-23 08:24:23 +0000782 # grabs _active_limbo_lock.
Victor Stinner2a129742011-05-30 23:02:52 +0200783 del _active[get_ident()]
Christian Heimes1af737c2008-01-23 08:24:23 +0000784 except:
785 pass
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000786
Guido van Rossumd0648992007-08-20 19:25:41 +0000787 def _stop(self):
Christian Heimes969fe572008-01-25 11:23:10 +0000788 self._block.acquire()
789 self._stopped = True
Benjamin Peterson672b8032008-06-11 19:14:14 +0000790 self._block.notify_all()
Christian Heimes969fe572008-01-25 11:23:10 +0000791 self._block.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000792
Guido van Rossumd0648992007-08-20 19:25:41 +0000793 def _delete(self):
Tim Peters21429932004-07-21 03:36:52 +0000794 "Remove current thread from the dict of currently running threads."
Brett Cannon8b3d92a2004-07-21 02:21:58 +0000795
Georg Brandl2067bfd2008-05-25 13:05:15 +0000796 # Notes about running with _dummy_thread:
Tim Peters21429932004-07-21 03:36:52 +0000797 #
Georg Brandl2067bfd2008-05-25 13:05:15 +0000798 # Must take care to not raise an exception if _dummy_thread is being
Tim Peters21429932004-07-21 03:36:52 +0000799 # used (and thus this module is being used as an instance of
Georg Brandl2067bfd2008-05-25 13:05:15 +0000800 # dummy_threading). _dummy_thread.get_ident() always returns -1 since
801 # there is only one thread if _dummy_thread is being used. Thus
Tim Peters21429932004-07-21 03:36:52 +0000802 # len(_active) is always <= 1 here, and any Thread instance created
803 # overwrites the (if any) thread currently registered in _active.
804 #
805 # An instance of _MainThread is always created by 'threading'. This
806 # gets overwritten the instant an instance of Thread is created; both
Georg Brandl2067bfd2008-05-25 13:05:15 +0000807 # threads return -1 from _dummy_thread.get_ident() and thus have the
Tim Peters21429932004-07-21 03:36:52 +0000808 # same key in the dict. So when the _MainThread instance created by
809 # 'threading' tries to clean itself up when atexit calls this method
810 # it gets a KeyError if another Thread instance was created.
811 #
812 # This all means that KeyError from trying to delete something from
813 # _active if dummy_threading is being used is a red herring. But
814 # since it isn't if dummy_threading is *not* being used then don't
815 # hide the exception.
Brett Cannon8b3d92a2004-07-21 02:21:58 +0000816
Christian Heimes969fe572008-01-25 11:23:10 +0000817 try:
Neal Norwitzf5c7c2e2008-04-05 04:47:45 +0000818 with _active_limbo_lock:
Victor Stinner2a129742011-05-30 23:02:52 +0200819 del _active[get_ident()]
Neal Norwitzf5c7c2e2008-04-05 04:47:45 +0000820 # There must not be any python code between the previous line
821 # and after the lock is released. Otherwise a tracing function
822 # could try to acquire the lock again in the same thread, (in
Benjamin Peterson672b8032008-06-11 19:14:14 +0000823 # current_thread()), and would block.
Neal Norwitzf5c7c2e2008-04-05 04:47:45 +0000824 except KeyError:
825 if 'dummy_threading' not in _sys.modules:
826 raise
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000827
828 def join(self, timeout=None):
Guido van Rossumd0648992007-08-20 19:25:41 +0000829 if not self._initialized:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000830 raise RuntimeError("Thread.__init__() not called")
Benjamin Peterson672b8032008-06-11 19:14:14 +0000831 if not self._started.is_set():
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000832 raise RuntimeError("cannot join thread before it is started")
Benjamin Peterson672b8032008-06-11 19:14:14 +0000833 if self is current_thread():
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000834 raise RuntimeError("cannot join current thread")
835
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000836 if __debug__:
Guido van Rossumd0648992007-08-20 19:25:41 +0000837 if not self._stopped:
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000838 self._note("%s.join(): waiting until thread stops", self)
Christian Heimes969fe572008-01-25 11:23:10 +0000839
840 self._block.acquire()
841 try:
Brett Cannonad07ff22005-11-23 02:15:50 +0000842 if timeout is None:
Guido van Rossumd0648992007-08-20 19:25:41 +0000843 while not self._stopped:
844 self._block.wait()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000845 if __debug__:
846 self._note("%s.join(): thread stopped", self)
Brett Cannonad07ff22005-11-23 02:15:50 +0000847 else:
848 deadline = _time() + timeout
Guido van Rossumd0648992007-08-20 19:25:41 +0000849 while not self._stopped:
Brett Cannonad07ff22005-11-23 02:15:50 +0000850 delay = deadline - _time()
851 if delay <= 0:
852 if __debug__:
853 self._note("%s.join(): timed out", self)
854 break
Guido van Rossumd0648992007-08-20 19:25:41 +0000855 self._block.wait(delay)
Brett Cannonad07ff22005-11-23 02:15:50 +0000856 else:
857 if __debug__:
858 self._note("%s.join(): thread stopped", self)
Christian Heimes969fe572008-01-25 11:23:10 +0000859 finally:
860 self._block.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000861
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000862 @property
863 def name(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000864 assert self._initialized, "Thread.__init__() not called"
865 return self._name
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000866
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000867 @name.setter
868 def name(self, name):
Guido van Rossumd0648992007-08-20 19:25:41 +0000869 assert self._initialized, "Thread.__init__() not called"
870 self._name = str(name)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000871
Benjamin Peterson773c17b2008-08-18 16:45:31 +0000872 @property
873 def ident(self):
Georg Brandl0c77a822008-06-10 16:37:50 +0000874 assert self._initialized, "Thread.__init__() not called"
875 return self._ident
876
Benjamin Peterson672b8032008-06-11 19:14:14 +0000877 def is_alive(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000878 assert self._initialized, "Thread.__init__() not called"
Benjamin Peterson672b8032008-06-11 19:14:14 +0000879 return self._started.is_set() and not self._stopped
Tim Petersb90f89a2001-01-15 03:26:36 +0000880
Benjamin Petersonb3085c92008-09-01 23:09:31 +0000881 isAlive = is_alive
Benjamin Petersonf0923f52008-08-18 22:10:13 +0000882
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000883 @property
884 def daemon(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000885 assert self._initialized, "Thread.__init__() not called"
886 return self._daemonic
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000887
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000888 @daemon.setter
889 def daemon(self, daemonic):
Guido van Rossumd0648992007-08-20 19:25:41 +0000890 if not self._initialized:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000891 raise RuntimeError("Thread.__init__() not called")
Benjamin Peterson672b8032008-06-11 19:14:14 +0000892 if self._started.is_set():
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000893 raise RuntimeError("cannot set daemon status of active thread");
Guido van Rossumd0648992007-08-20 19:25:41 +0000894 self._daemonic = daemonic
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000895
Benjamin Peterson6640d722008-08-18 18:16:46 +0000896 def isDaemon(self):
897 return self.daemon
898
899 def setDaemon(self, daemonic):
900 self.daemon = daemonic
901
902 def getName(self):
903 return self.name
904
905 def setName(self, name):
906 self.name = name
907
Martin v. Löwis44f86962001-09-05 13:44:54 +0000908# The timer class was contributed by Itamar Shtull-Trauring
909
Éric Araujo0cdd4452011-07-28 00:28:28 +0200910class Timer(Thread):
Martin v. Löwis44f86962001-09-05 13:44:54 +0000911 """Call a function after a specified number of seconds:
Tim Petersb64bec32001-09-18 02:26:39 +0000912
Martin v. Löwis44f86962001-09-05 13:44:54 +0000913 t = Timer(30.0, f, args=[], kwargs={})
914 t.start()
915 t.cancel() # stop the timer's action if it's still waiting
916 """
Tim Petersb64bec32001-09-18 02:26:39 +0000917
Martin v. Löwis44f86962001-09-05 13:44:54 +0000918 def __init__(self, interval, function, args=[], kwargs={}):
919 Thread.__init__(self)
920 self.interval = interval
921 self.function = function
922 self.args = args
923 self.kwargs = kwargs
924 self.finished = Event()
Tim Petersb64bec32001-09-18 02:26:39 +0000925
Martin v. Löwis44f86962001-09-05 13:44:54 +0000926 def cancel(self):
927 """Stop the timer if it hasn't finished yet"""
928 self.finished.set()
Tim Petersb64bec32001-09-18 02:26:39 +0000929
Martin v. Löwis44f86962001-09-05 13:44:54 +0000930 def run(self):
931 self.finished.wait(self.interval)
Benjamin Peterson672b8032008-06-11 19:14:14 +0000932 if not self.finished.is_set():
Martin v. Löwis44f86962001-09-05 13:44:54 +0000933 self.function(*self.args, **self.kwargs)
934 self.finished.set()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000935
936# Special thread class to represent the main thread
937# This is garbage collected through an exit handler
938
939class _MainThread(Thread):
940
941 def __init__(self):
Antoine Pitrou0bd4deb2011-02-25 22:07:43 +0000942 Thread.__init__(self, name="MainThread", daemon=False)
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000943 self._started.set()
Benjamin Petersond23f8222009-04-05 19:13:16 +0000944 self._set_ident()
945 with _active_limbo_lock:
946 _active[self._ident] = self
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000947
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000948 def _exitfunc(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000949 self._stop()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000950 t = _pickSomeNonDaemonThread()
951 if t:
952 if __debug__:
953 self._note("%s: waiting for other threads", self)
954 while t:
955 t.join()
956 t = _pickSomeNonDaemonThread()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000957 if __debug__:
958 self._note("%s: exiting", self)
Guido van Rossumd0648992007-08-20 19:25:41 +0000959 self._delete()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000960
961def _pickSomeNonDaemonThread():
962 for t in enumerate():
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000963 if not t.daemon and t.is_alive():
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000964 return t
965 return None
966
967
968# Dummy thread class to represent threads not started here.
Tim Peters711906e2005-01-08 07:30:42 +0000969# These aren't garbage collected when they die, nor can they be waited for.
Benjamin Peterson672b8032008-06-11 19:14:14 +0000970# If they invoke anything in threading.py that calls current_thread(), they
Tim Peters711906e2005-01-08 07:30:42 +0000971# leave an entry in the _active dict forever after.
Benjamin Peterson672b8032008-06-11 19:14:14 +0000972# Their purpose is to return *something* from current_thread().
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000973# They are marked as daemon threads so we won't wait for them
974# when we exit (conform previous semantics).
975
976class _DummyThread(Thread):
Tim Petersb90f89a2001-01-15 03:26:36 +0000977
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000978 def __init__(self):
Antoine Pitrou0bd4deb2011-02-25 22:07:43 +0000979 Thread.__init__(self, name=_newname("Dummy-%d"), daemon=True)
Tim Peters711906e2005-01-08 07:30:42 +0000980
Gregory P. Smith9bd4a242011-01-04 18:33:38 +0000981 # Thread._block consumes an OS-level locking primitive, which
Tim Peters711906e2005-01-08 07:30:42 +0000982 # can never be used by a _DummyThread. Since a _DummyThread
983 # instance is immortal, that's bad, so release this resource.
Guido van Rossumd0648992007-08-20 19:25:41 +0000984 del self._block
Tim Peters711906e2005-01-08 07:30:42 +0000985
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000986 self._started.set()
Benjamin Petersond23f8222009-04-05 19:13:16 +0000987 self._set_ident()
988 with _active_limbo_lock:
989 _active[self._ident] = self
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000990
Neal Norwitz45bec8c2002-02-19 03:01:36 +0000991 def join(self, timeout=None):
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000992 assert False, "cannot join a dummy thread"
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000993
994
995# Global API functions
996
Benjamin Peterson672b8032008-06-11 19:14:14 +0000997def current_thread():
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000998 try:
Victor Stinner2a129742011-05-30 23:02:52 +0200999 return _active[get_ident()]
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001000 except KeyError:
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001001 return _DummyThread()
1002
Benjamin Petersonb3085c92008-09-01 23:09:31 +00001003currentThread = current_thread
Benjamin Petersonf0923f52008-08-18 22:10:13 +00001004
Benjamin Peterson672b8032008-06-11 19:14:14 +00001005def active_count():
Benjamin Petersond23f8222009-04-05 19:13:16 +00001006 with _active_limbo_lock:
1007 return len(_active) + len(_limbo)
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001008
Benjamin Petersonb3085c92008-09-01 23:09:31 +00001009activeCount = active_count
Benjamin Petersonf0923f52008-08-18 22:10:13 +00001010
Antoine Pitroubdec11f2009-11-05 13:49:14 +00001011def _enumerate():
1012 # Same as enumerate(), but without the lock. Internal use only.
1013 return list(_active.values()) + list(_limbo.values())
1014
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001015def enumerate():
Benjamin Petersond23f8222009-04-05 19:13:16 +00001016 with _active_limbo_lock:
1017 return list(_active.values()) + list(_limbo.values())
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001018
Georg Brandl2067bfd2008-05-25 13:05:15 +00001019from _thread import stack_size
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001020
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001021# Create the main thread object,
1022# and make it available for the interpreter
1023# (Py_Main) as threading._shutdown.
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001024
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001025_shutdown = _MainThread()._exitfunc
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001026
Jim Fultond15dc062004-07-14 19:11:50 +00001027# get thread-local implementation, either from the thread
1028# module, or from the python fallback
1029
1030try:
Georg Brandl2067bfd2008-05-25 13:05:15 +00001031 from _thread import _local as local
Jim Fultond15dc062004-07-14 19:11:50 +00001032except ImportError:
1033 from _threading_local import local
1034
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001035
Jesse Nollera8513972008-07-17 16:49:17 +00001036def _after_fork():
1037 # This function is called by Python/ceval.c:PyEval_ReInitThreads which
1038 # is called from PyOS_AfterFork. Here we cleanup threading module state
1039 # that should not exist after a fork.
1040
1041 # Reset _active_limbo_lock, in case we forked while the lock was held
1042 # by another (non-forked) thread. http://bugs.python.org/issue874900
1043 global _active_limbo_lock
1044 _active_limbo_lock = _allocate_lock()
1045
1046 # fork() only copied the current thread; clear references to others.
1047 new_active = {}
1048 current = current_thread()
1049 with _active_limbo_lock:
Antoine Pitrou5fe291f2008-09-06 23:00:03 +00001050 for thread in _active.values():
Charles-François Natalib055bf62011-12-18 18:45:16 +01001051 # Any lock/condition variable may be currently locked or in an
1052 # invalid state, so we reinitialize them.
1053 thread._reset_internal_locks()
Jesse Nollera8513972008-07-17 16:49:17 +00001054 if thread is current:
Antoine Pitrou5fe291f2008-09-06 23:00:03 +00001055 # There is only one active thread. We reset the ident to
1056 # its new value since it can have changed.
Victor Stinner2a129742011-05-30 23:02:52 +02001057 ident = get_ident()
Antoine Pitrou5fe291f2008-09-06 23:00:03 +00001058 thread._ident = ident
Jesse Nollera8513972008-07-17 16:49:17 +00001059 new_active[ident] = thread
1060 else:
1061 # All the others are already stopped.
Charles-François Natalib055bf62011-12-18 18:45:16 +01001062 thread._stop()
Jesse Nollera8513972008-07-17 16:49:17 +00001063
1064 _limbo.clear()
1065 _active.clear()
1066 _active.update(new_active)
1067 assert len(_active) == 1