blob: 41956edce7aeb784b12ca0605bbf6d00e2cf2fb3 [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
Guido van Rossum7f5013a1998-04-09 22:01:42 +00009
Benjamin Petersonb3085c92008-09-01 23:09:31 +000010# Note regarding PEP 8 compliant names
11# This threading model was originally inspired by Java, and inherited
12# the convention of camelCase function and method names from that
13# language. Those originaly names are not in any imminent danger of
14# being deprecated (even for Py3k),so this module provides them as an
15# alias for the PEP 8 compliant names
16# Note that using the new PEP 8 compliant names facilitates substitution
17# with the multiprocessing module, which doesn't provide the old
18# Java inspired names.
19
20
Guido van Rossum7f5013a1998-04-09 22:01:42 +000021# Rename some stuff so "from threading import *" is safe
Benjamin Peterson672b8032008-06-11 19:14:14 +000022__all__ = ['active_count', 'Condition', 'current_thread', 'enumerate', 'Event',
Tim Peters685e6972003-06-29 16:50:06 +000023 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread',
Thomas Wouters0e3f5912006-08-11 14:57:12 +000024 'Timer', 'setprofile', 'settrace', 'local', 'stack_size']
Guido van Rossum7f5013a1998-04-09 22:01:42 +000025
Georg Brandl2067bfd2008-05-25 13:05:15 +000026_start_new_thread = _thread.start_new_thread
27_allocate_lock = _thread.allocate_lock
28_get_ident = _thread.get_ident
29ThreadError = _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).
39# All the major classes here derive from _Verbose. We force that to
40# be a new-style class so that all the major classes here are new-style.
41# This helps debugging (type(instance) is more revealing for instances
42# of new-style classes).
Guido van Rossum7f5013a1998-04-09 22:01:42 +000043
Tim Peters0939fac2003-07-01 19:28:44 +000044_VERBOSE = False
Guido van Rossum7f5013a1998-04-09 22:01:42 +000045
46if __debug__:
47
Tim Peters59aba122003-07-01 20:01:55 +000048 class _Verbose(object):
Guido van Rossum7f5013a1998-04-09 22:01:42 +000049
50 def __init__(self, verbose=None):
51 if verbose is None:
52 verbose = _VERBOSE
Guido van Rossumd0648992007-08-20 19:25:41 +000053 self._verbose = verbose
Guido van Rossum7f5013a1998-04-09 22:01:42 +000054
55 def _note(self, format, *args):
Guido van Rossumd0648992007-08-20 19:25:41 +000056 if self._verbose:
Guido van Rossum7f5013a1998-04-09 22:01:42 +000057 format = format % args
58 format = "%s: %s\n" % (
Benjamin Petersonfdbea962008-08-18 17:33:47 +000059 current_thread().name, format)
Guido van Rossum7f5013a1998-04-09 22:01:42 +000060 _sys.stderr.write(format)
61
62else:
63 # Disable this when using "python -O"
Tim Peters59aba122003-07-01 20:01:55 +000064 class _Verbose(object):
Guido van Rossum7f5013a1998-04-09 22:01:42 +000065 def __init__(self, verbose=None):
66 pass
67 def _note(self, *args):
68 pass
69
Jeremy Hyltonbfccb352003-06-29 16:58:41 +000070# Support for profile and trace hooks
71
72_profile_hook = None
73_trace_hook = None
74
75def setprofile(func):
76 global _profile_hook
77 _profile_hook = func
Tim Petersd1b108b2003-06-29 17:24:17 +000078
Jeremy Hyltonbfccb352003-06-29 16:58:41 +000079def settrace(func):
80 global _trace_hook
81 _trace_hook = func
Guido van Rossum7f5013a1998-04-09 22:01:42 +000082
83# Synchronization classes
84
85Lock = _allocate_lock
86
Antoine Pitrou434736a2009-11-10 18:46:01 +000087def RLock(verbose=None, *args, **kwargs):
88 if verbose is None:
89 verbose = _VERBOSE
90 if (__debug__ and verbose) or _CRLock is None:
91 return _PyRLock(verbose, *args, **kwargs)
92 return _CRLock(*args, **kwargs)
Guido van Rossum7f5013a1998-04-09 22:01:42 +000093
94class _RLock(_Verbose):
Tim Petersb90f89a2001-01-15 03:26:36 +000095
Guido van Rossum7f5013a1998-04-09 22:01:42 +000096 def __init__(self, verbose=None):
97 _Verbose.__init__(self, verbose)
Guido van Rossumd0648992007-08-20 19:25:41 +000098 self._block = _allocate_lock()
99 self._owner = None
100 self._count = 0
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000101
102 def __repr__(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000103 owner = self._owner
Antoine Pitroub0872682009-11-09 16:08:16 +0000104 try:
105 owner = _active[owner].name
106 except KeyError:
107 pass
108 return "<%s owner=%r count=%d>" % (
109 self.__class__.__name__, owner, self._count)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000110
Antoine Pitrou7c3e5772010-04-14 15:44:10 +0000111 def acquire(self, blocking=True, timeout=-1):
Antoine Pitroub0872682009-11-09 16:08:16 +0000112 me = _get_ident()
113 if self._owner == me:
Guido van Rossumd0648992007-08-20 19:25:41 +0000114 self._count = self._count + 1
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000115 if __debug__:
116 self._note("%s.acquire(%s): recursive success", self, blocking)
117 return 1
Antoine Pitrou7c3e5772010-04-14 15:44:10 +0000118 rc = self._block.acquire(blocking, timeout)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000119 if rc:
Guido van Rossumd0648992007-08-20 19:25:41 +0000120 self._owner = me
121 self._count = 1
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000122 if __debug__:
Brett Cannon90cece72005-01-27 22:48:30 +0000123 self._note("%s.acquire(%s): initial success", self, blocking)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000124 else:
125 if __debug__:
126 self._note("%s.acquire(%s): failure", self, blocking)
127 return rc
128
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000129 __enter__ = acquire
130
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000131 def release(self):
Antoine Pitroub0872682009-11-09 16:08:16 +0000132 if self._owner != _get_ident():
Georg Brandl495f7b52009-10-27 15:28:25 +0000133 raise RuntimeError("cannot release un-acquired lock")
Guido van Rossumd0648992007-08-20 19:25:41 +0000134 self._count = count = self._count - 1
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000135 if not count:
Guido van Rossumd0648992007-08-20 19:25:41 +0000136 self._owner = None
137 self._block.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000138 if __debug__:
139 self._note("%s.release(): final release", self)
140 else:
141 if __debug__:
142 self._note("%s.release(): non-final release", self)
143
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000144 def __exit__(self, t, v, tb):
145 self.release()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000146
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000147 # Internal methods used by condition variables
148
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000149 def _acquire_restore(self, state):
Guido van Rossumd0648992007-08-20 19:25:41 +0000150 self._block.acquire()
151 self._count, self._owner = state
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000152 if __debug__:
153 self._note("%s._acquire_restore()", self)
154
155 def _release_save(self):
156 if __debug__:
157 self._note("%s._release_save()", self)
Guido van Rossumd0648992007-08-20 19:25:41 +0000158 count = self._count
159 self._count = 0
160 owner = self._owner
161 self._owner = None
162 self._block.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000163 return (count, owner)
164
165 def _is_owned(self):
Antoine Pitroub0872682009-11-09 16:08:16 +0000166 return self._owner == _get_ident()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000167
Antoine Pitrou434736a2009-11-10 18:46:01 +0000168_PyRLock = _RLock
169
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000170
171def Condition(*args, **kwargs):
Guido van Rossum68468eb2003-02-27 20:14:51 +0000172 return _Condition(*args, **kwargs)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000173
174class _Condition(_Verbose):
175
176 def __init__(self, lock=None, verbose=None):
177 _Verbose.__init__(self, verbose)
178 if lock is None:
179 lock = RLock()
Guido van Rossumd0648992007-08-20 19:25:41 +0000180 self._lock = lock
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000181 # Export the lock's acquire() and release() methods
182 self.acquire = lock.acquire
183 self.release = lock.release
184 # If the lock defines _release_save() and/or _acquire_restore(),
185 # these override the default implementations (which just call
186 # release() and acquire() on the lock). Ditto for _is_owned().
187 try:
188 self._release_save = lock._release_save
189 except AttributeError:
190 pass
191 try:
192 self._acquire_restore = lock._acquire_restore
193 except AttributeError:
194 pass
195 try:
196 self._is_owned = lock._is_owned
197 except AttributeError:
198 pass
Guido van Rossumd0648992007-08-20 19:25:41 +0000199 self._waiters = []
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000200
Thomas Wouters477c8d52006-05-27 19:21:47 +0000201 def __enter__(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000202 return self._lock.__enter__()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000203
Thomas Wouters477c8d52006-05-27 19:21:47 +0000204 def __exit__(self, *args):
Guido van Rossumd0648992007-08-20 19:25:41 +0000205 return self._lock.__exit__(*args)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000206
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000207 def __repr__(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000208 return "<Condition(%s, %d)>" % (self._lock, len(self._waiters))
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000209
210 def _release_save(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000211 self._lock.release() # No state to save
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000212
213 def _acquire_restore(self, x):
Guido van Rossumd0648992007-08-20 19:25:41 +0000214 self._lock.acquire() # Ignore saved state
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000215
216 def _is_owned(self):
Benjamin Peterson672b8032008-06-11 19:14:14 +0000217 # Return True if lock is owned by current_thread.
Jeremy Hyltonaf7fde72002-08-14 17:43:59 +0000218 # This method is called only if __lock doesn't have _is_owned().
Guido van Rossumd0648992007-08-20 19:25:41 +0000219 if self._lock.acquire(0):
220 self._lock.release()
Tim Petersbc0e9102002-04-04 22:55:58 +0000221 return False
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000222 else:
Tim Petersbc0e9102002-04-04 22:55:58 +0000223 return True
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000224
225 def wait(self, timeout=None):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000226 if not self._is_owned():
Georg Brandl495f7b52009-10-27 15:28:25 +0000227 raise RuntimeError("cannot wait on un-acquired lock")
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000228 waiter = _allocate_lock()
229 waiter.acquire()
Guido van Rossumd0648992007-08-20 19:25:41 +0000230 self._waiters.append(waiter)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000231 saved_state = self._release_save()
Tim Petersc951bf92001-04-02 20:15:57 +0000232 try: # restore state no matter what (e.g., KeyboardInterrupt)
233 if timeout is None:
234 waiter.acquire()
Georg Brandlb9a43912010-10-28 09:03:20 +0000235 gotit = True
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000236 if __debug__:
Tim Petersc951bf92001-04-02 20:15:57 +0000237 self._note("%s.wait(): got it", self)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000238 else:
Antoine Pitrou7c3e5772010-04-14 15:44:10 +0000239 if timeout > 0:
240 gotit = waiter.acquire(True, timeout)
241 else:
242 gotit = waiter.acquire(False)
Tim Petersc951bf92001-04-02 20:15:57 +0000243 if not gotit:
244 if __debug__:
245 self._note("%s.wait(%s): timed out", self, timeout)
246 try:
Guido van Rossumd0648992007-08-20 19:25:41 +0000247 self._waiters.remove(waiter)
Tim Petersc951bf92001-04-02 20:15:57 +0000248 except ValueError:
249 pass
250 else:
251 if __debug__:
252 self._note("%s.wait(%s): got it", self, timeout)
Georg Brandlb9a43912010-10-28 09:03:20 +0000253 return gotit
Tim Petersc951bf92001-04-02 20:15:57 +0000254 finally:
255 self._acquire_restore(saved_state)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000256
257 def notify(self, n=1):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000258 if not self._is_owned():
Georg Brandl495f7b52009-10-27 15:28:25 +0000259 raise RuntimeError("cannot notify on un-acquired lock")
Guido van Rossumd0648992007-08-20 19:25:41 +0000260 __waiters = self._waiters
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000261 waiters = __waiters[:n]
262 if not waiters:
263 if __debug__:
264 self._note("%s.notify(): no waiters", self)
265 return
266 self._note("%s.notify(): notifying %d waiter%s", self, n,
267 n!=1 and "s" or "")
268 for waiter in waiters:
269 waiter.release()
270 try:
271 __waiters.remove(waiter)
272 except ValueError:
273 pass
274
Benjamin Peterson672b8032008-06-11 19:14:14 +0000275 def notify_all(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000276 self.notify(len(self._waiters))
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000277
Benjamin Petersonb3085c92008-09-01 23:09:31 +0000278 notifyAll = notify_all
279
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000280
281def Semaphore(*args, **kwargs):
Guido van Rossum68468eb2003-02-27 20:14:51 +0000282 return _Semaphore(*args, **kwargs)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000283
284class _Semaphore(_Verbose):
285
Andrew M. Kuchling39d3bfc2000-02-29 00:10:24 +0000286 # After Tim Peters' semaphore class, but not quite the same (no maximum)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000287
288 def __init__(self, value=1, verbose=None):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000289 if value < 0:
290 raise ValueError("semaphore initial value must be >= 0")
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000291 _Verbose.__init__(self, verbose)
Guido van Rossumd0648992007-08-20 19:25:41 +0000292 self._cond = Condition(Lock())
293 self._value = value
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000294
Antoine Pitrou0454af92010-04-17 23:51:58 +0000295 def acquire(self, blocking=True, timeout=None):
296 if not blocking and timeout is not None:
297 raise ValueError("can't specify timeout for non-blocking acquire")
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000298 rc = False
Antoine Pitrou0454af92010-04-17 23:51:58 +0000299 endtime = None
Guido van Rossumd0648992007-08-20 19:25:41 +0000300 self._cond.acquire()
301 while self._value == 0:
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000302 if not blocking:
303 break
Skip Montanarob446fc72001-08-19 04:25:24 +0000304 if __debug__:
305 self._note("%s.acquire(%s): blocked waiting, value=%s",
Guido van Rossumd0648992007-08-20 19:25:41 +0000306 self, blocking, self._value)
Antoine Pitrou0454af92010-04-17 23:51:58 +0000307 if timeout is not None:
308 if endtime is None:
309 endtime = _time() + timeout
310 else:
311 timeout = endtime - _time()
312 if timeout <= 0:
313 break
314 self._cond.wait(timeout)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000315 else:
Guido van Rossumd0648992007-08-20 19:25:41 +0000316 self._value = self._value - 1
Skip Montanarob446fc72001-08-19 04:25:24 +0000317 if __debug__:
Skip Montanaroae8454a2001-08-19 05:53:47 +0000318 self._note("%s.acquire: success, value=%s",
Guido van Rossumd0648992007-08-20 19:25:41 +0000319 self, self._value)
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000320 rc = True
Guido van Rossumd0648992007-08-20 19:25:41 +0000321 self._cond.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000322 return rc
323
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000324 __enter__ = acquire
325
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000326 def release(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000327 self._cond.acquire()
328 self._value = self._value + 1
Skip Montanarob446fc72001-08-19 04:25:24 +0000329 if __debug__:
Skip Montanaroae8454a2001-08-19 05:53:47 +0000330 self._note("%s.release: success, value=%s",
Guido van Rossumd0648992007-08-20 19:25:41 +0000331 self, self._value)
332 self._cond.notify()
333 self._cond.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000334
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000335 def __exit__(self, t, v, tb):
336 self.release()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000337
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000338
Skip Montanaroe428bb72001-08-20 20:27:58 +0000339def BoundedSemaphore(*args, **kwargs):
Guido van Rossum68468eb2003-02-27 20:14:51 +0000340 return _BoundedSemaphore(*args, **kwargs)
Skip Montanaroe428bb72001-08-20 20:27:58 +0000341
342class _BoundedSemaphore(_Semaphore):
343 """Semaphore that checks that # releases is <= # acquires"""
344 def __init__(self, value=1, verbose=None):
345 _Semaphore.__init__(self, value, verbose)
346 self._initial_value = value
347
348 def release(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000349 if self._value >= self._initial_value:
Collin Winterce36ad82007-08-30 01:19:48 +0000350 raise ValueError("Semaphore released too many times")
Skip Montanaroe428bb72001-08-20 20:27:58 +0000351 return _Semaphore.release(self)
352
353
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000354def Event(*args, **kwargs):
Guido van Rossum68468eb2003-02-27 20:14:51 +0000355 return _Event(*args, **kwargs)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000356
357class _Event(_Verbose):
358
359 # After Tim Peters' event class (without is_posted())
360
361 def __init__(self, verbose=None):
362 _Verbose.__init__(self, verbose)
Guido van Rossumd0648992007-08-20 19:25:41 +0000363 self._cond = Condition(Lock())
364 self._flag = False
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000365
Benjamin Peterson672b8032008-06-11 19:14:14 +0000366 def is_set(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000367 return self._flag
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000368
Benjamin Petersonb3085c92008-09-01 23:09:31 +0000369 isSet = is_set
Benjamin Petersonf0923f52008-08-18 22:10:13 +0000370
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000371 def set(self):
Christian Heimes969fe572008-01-25 11:23:10 +0000372 self._cond.acquire()
373 try:
Guido van Rossumd0648992007-08-20 19:25:41 +0000374 self._flag = True
Benjamin Peterson672b8032008-06-11 19:14:14 +0000375 self._cond.notify_all()
Christian Heimes969fe572008-01-25 11:23:10 +0000376 finally:
377 self._cond.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000378
379 def clear(self):
Christian Heimes969fe572008-01-25 11:23:10 +0000380 self._cond.acquire()
381 try:
Guido van Rossumd0648992007-08-20 19:25:41 +0000382 self._flag = False
Christian Heimes969fe572008-01-25 11:23:10 +0000383 finally:
384 self._cond.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000385
386 def wait(self, timeout=None):
Christian Heimes969fe572008-01-25 11:23:10 +0000387 self._cond.acquire()
388 try:
Guido van Rossumd0648992007-08-20 19:25:41 +0000389 if not self._flag:
390 self._cond.wait(timeout)
Benjamin Petersond23f8222009-04-05 19:13:16 +0000391 return self._flag
Christian Heimes969fe572008-01-25 11:23:10 +0000392 finally:
393 self._cond.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000394
Kristján Valur Jónsson3be00032010-10-28 09:43:10 +0000395
396# A barrier class. Inspired in part by the pthread_barrier_* api and
397# the CyclicBarrier class from Java. See
398# http://sourceware.org/pthreads-win32/manual/pthread_barrier_init.html and
399# http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/
400# CyclicBarrier.html
401# for information.
402# We maintain two main states, 'filling' and 'draining' enabling the barrier
403# to be cyclic. Threads are not allowed into it until it has fully drained
404# since the previous cycle. In addition, a 'resetting' state exists which is
405# similar to 'draining' except that threads leave with a BrokenBarrierError,
406# and a 'broken' state in which all threads get get the exception.
407class Barrier(_Verbose):
408 """
409 Barrier. Useful for synchronizing a fixed number of threads
410 at known synchronization points. Threads block on 'wait()' and are
411 simultaneously once they have all made that call.
412 """
413 def __init__(self, parties, action=None, timeout=None, verbose=None):
414 """
415 Create a barrier, initialised to 'parties' threads.
416 'action' is a callable which, when supplied, will be called
417 by one of the threads after they have all entered the
418 barrier and just prior to releasing them all.
419 If a 'timeout' is provided, it is uses as the default for
420 all subsequent 'wait()' calls.
421 """
422 _Verbose.__init__(self, verbose)
423 self._cond = Condition(Lock())
424 self._action = action
425 self._timeout = timeout
426 self._parties = parties
427 self._state = 0 #0 filling, 1, draining, -1 resetting, -2 broken
428 self._count = 0
429
430 def wait(self, timeout=None):
431 """
432 Wait for the barrier. When the specified number of threads have
433 started waiting, they are all simultaneously awoken. If an 'action'
434 was provided for the barrier, one of the threads will have executed
435 that callback prior to returning.
436 Returns an individual index number from 0 to 'parties-1'.
437 """
438 if timeout is None:
439 timeout = self._timeout
440 with self._cond:
441 self._enter() # Block while the barrier drains.
442 index = self._count
443 self._count += 1
444 try:
445 if index + 1 == self._parties:
446 # We release the barrier
447 self._release()
448 else:
449 # We wait until someone releases us
450 self._wait(timeout)
451 return index
452 finally:
453 self._count -= 1
454 # Wake up any threads waiting for barrier to drain.
455 self._exit()
456
457 # Block until the barrier is ready for us, or raise an exception
458 # if it is broken.
459 def _enter(self):
460 while self._state in (-1, 1):
461 # It is draining or resetting, wait until done
462 self._cond.wait()
463 #see if the barrier is in a broken state
464 if self._state < 0:
465 raise BrokenBarrierError
466 assert self._state == 0
467
468 # Optionally run the 'action' and release the threads waiting
469 # in the barrier.
470 def _release(self):
471 try:
472 if self._action:
473 self._action()
474 # enter draining state
475 self._state = 1
476 self._cond.notify_all()
477 except:
478 #an exception during the _action handler. Break and reraise
479 self._break()
480 raise
481
482 # Wait in the barrier until we are relased. Raise an exception
483 # if the barrier is reset or broken.
484 def _wait(self, timeout):
485 while self._state == 0:
486 if self._cond.wait(timeout) is False:
487 #timed out. Break the barrier
488 self._break()
489 raise BrokenBarrierError
490 if self._state < 0:
491 raise BrokenBarrierError
492 assert self._state == 1
493
494 # If we are the last thread to exit the barrier, signal any threads
495 # waiting for the barrier to drain.
496 def _exit(self):
497 if self._count == 0:
498 if self._state in (-1, 1):
499 #resetting or draining
500 self._state = 0
501 self._cond.notify_all()
502
503 def reset(self):
504 """
505 Reset the barrier to the initial state.
506 Any threads currently waiting will get the BrokenBarrier exception
507 raised.
508 """
509 with self._cond:
510 if self._count > 0:
511 if self._state == 0:
512 #reset the barrier, waking up threads
513 self._state = -1
514 elif self._state == -2:
515 #was broken, set it to reset state
516 #which clears when the last thread exits
517 self._state = -1
518 else:
519 self._state = 0
520 self._cond.notify_all()
521
522 def abort(self):
523 """
524 Place the barrier into a 'broken' state.
525 Useful in case of error. Any currently waiting threads and
526 threads attempting to 'wait()' will have BrokenBarrierError
527 raised.
528 """
529 with self._cond:
530 self._break()
531
532 def _break(self):
533 # An internal error was detected. The barrier is set to
534 # a broken state all parties awakened.
535 self._state = -2
536 self._cond.notify_all()
537
538 @property
539 def parties(self):
540 """
541 Return the number of threads required to trip the barrier.
542 """
543 return self._parties
544
545 @property
546 def n_waiting(self):
547 """
548 Return the number of threads that are currently waiting at the barrier.
549 """
550 # We don't need synchronization here since this is an ephemeral result
551 # anyway. It returns the correct value in the steady state.
552 if self._state == 0:
553 return self._count
554 return 0
555
556 @property
557 def broken(self):
558 """
559 Return True if the barrier is in a broken state
560 """
561 return self._state == -2
562
563#exception raised by the Barrier class
564class BrokenBarrierError(RuntimeError): pass
565
566
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000567# Helper to generate new thread names
568_counter = 0
569def _newname(template="Thread-%d"):
570 global _counter
571 _counter = _counter + 1
572 return template % _counter
573
574# Active thread administration
575_active_limbo_lock = _allocate_lock()
Tim Peters711906e2005-01-08 07:30:42 +0000576_active = {} # maps thread id to Thread object
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000577_limbo = {}
578
579
580# Main class for threads
581
582class Thread(_Verbose):
583
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000584 __initialized = False
Brett Cannoncc4e9352004-07-03 03:52:35 +0000585 # Need to store a reference to sys.exc_info for printing
586 # out exceptions when a thread tries to use a global var. during interp.
587 # shutdown and thus raises an exception about trying to perform some
588 # operation on/with a NoneType
589 __exc_info = _sys.exc_info
Christian Heimesbbe741d2008-03-28 10:53:29 +0000590 # Keep sys.exc_clear too to clear the exception just before
591 # allowing .join() to return.
592 #XXX __exc_clear = _sys.exc_clear
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000593
594 def __init__(self, group=None, target=None, name=None,
Georg Brandla4a8b822005-07-15 09:13:21 +0000595 args=(), kwargs=None, verbose=None):
Guido van Rossum5a43e1a1998-06-09 19:04:26 +0000596 assert group is None, "group argument must be None for now"
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000597 _Verbose.__init__(self, verbose)
Georg Brandla4a8b822005-07-15 09:13:21 +0000598 if kwargs is None:
599 kwargs = {}
Guido van Rossumd0648992007-08-20 19:25:41 +0000600 self._target = target
601 self._name = str(name or _newname())
602 self._args = args
603 self._kwargs = kwargs
604 self._daemonic = self._set_daemon()
Georg Brandl0c77a822008-06-10 16:37:50 +0000605 self._ident = None
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000606 self._started = Event()
Guido van Rossumd0648992007-08-20 19:25:41 +0000607 self._stopped = False
608 self._block = Condition(Lock())
609 self._initialized = True
Brett Cannoncc4e9352004-07-03 03:52:35 +0000610 # sys.stderr is not stored in the class like
611 # sys.exc_info since it can be changed between instances
Guido van Rossumd0648992007-08-20 19:25:41 +0000612 self._stderr = _sys.stderr
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000613
614 def _set_daemon(self):
615 # Overridden in _MainThread and _DummyThread
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000616 return current_thread().daemon
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000617
618 def __repr__(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000619 assert self._initialized, "Thread.__init__() was not called"
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000620 status = "initial"
Benjamin Peterson672b8032008-06-11 19:14:14 +0000621 if self._started.is_set():
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000622 status = "started"
Guido van Rossumd0648992007-08-20 19:25:41 +0000623 if self._stopped:
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000624 status = "stopped"
Guido van Rossumd0648992007-08-20 19:25:41 +0000625 if self._daemonic:
Georg Brandl0c77a822008-06-10 16:37:50 +0000626 status += " daemon"
627 if self._ident is not None:
628 status += " %s" % self._ident
Guido van Rossumd0648992007-08-20 19:25:41 +0000629 return "<%s(%s, %s)>" % (self.__class__.__name__, self._name, status)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000630
631 def start(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000632 if not self._initialized:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000633 raise RuntimeError("thread.__init__() not called")
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000634
Benjamin Peterson672b8032008-06-11 19:14:14 +0000635 if self._started.is_set():
Senthil Kumaranfdd4d0f2010-04-06 03:30:18 +0000636 raise RuntimeError("threads can only be started once")
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000637 if __debug__:
638 self._note("%s.start(): starting thread", self)
Benjamin Petersond23f8222009-04-05 19:13:16 +0000639 with _active_limbo_lock:
640 _limbo[self] = self
Gregory P. Smith3fdd9642010-02-28 18:57:46 +0000641 try:
642 _start_new_thread(self._bootstrap, ())
643 except Exception:
644 with _active_limbo_lock:
645 del _limbo[self]
646 raise
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000647 self._started.wait()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000648
649 def run(self):
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000650 try:
651 if self._target:
652 self._target(*self._args, **self._kwargs)
653 finally:
654 # Avoid a refcycle if the thread is running a function with
655 # an argument that has a member that points to the thread.
656 del self._target, self._args, self._kwargs
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000657
Guido van Rossumd0648992007-08-20 19:25:41 +0000658 def _bootstrap(self):
Guido van Rossum61e21b52007-08-20 19:06:03 +0000659 # Wrapper around the real bootstrap code that ignores
660 # exceptions during interpreter cleanup. Those typically
661 # happen when a daemon thread wakes up at an unfortunate
662 # moment, finds the world around it destroyed, and raises some
663 # random exception *** while trying to report the exception in
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000664 # _bootstrap_inner() below ***. Those random exceptions
Guido van Rossum61e21b52007-08-20 19:06:03 +0000665 # don't help anybody, and they confuse users, so we suppress
666 # them. We suppress them only when it appears that the world
667 # indeed has already been destroyed, so that exceptions in
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000668 # _bootstrap_inner() during normal business hours are properly
Guido van Rossum61e21b52007-08-20 19:06:03 +0000669 # reported. Also, we only suppress them for daemonic threads;
670 # if a non-daemonic encounters this, something else is wrong.
671 try:
Guido van Rossumd0648992007-08-20 19:25:41 +0000672 self._bootstrap_inner()
Guido van Rossum61e21b52007-08-20 19:06:03 +0000673 except:
Guido van Rossumd0648992007-08-20 19:25:41 +0000674 if self._daemonic and _sys is None:
Guido van Rossum61e21b52007-08-20 19:06:03 +0000675 return
676 raise
677
Benjamin Petersond23f8222009-04-05 19:13:16 +0000678 def _set_ident(self):
679 self._ident = _get_ident()
680
Guido van Rossumd0648992007-08-20 19:25:41 +0000681 def _bootstrap_inner(self):
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000682 try:
Benjamin Petersond23f8222009-04-05 19:13:16 +0000683 self._set_ident()
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000684 self._started.set()
Benjamin Petersond23f8222009-04-05 19:13:16 +0000685 with _active_limbo_lock:
686 _active[self._ident] = self
687 del _limbo[self]
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000688 if __debug__:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000689 self._note("%s._bootstrap(): thread started", self)
Jeremy Hyltonbfccb352003-06-29 16:58:41 +0000690
691 if _trace_hook:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000692 self._note("%s._bootstrap(): registering trace hook", self)
Jeremy Hyltonbfccb352003-06-29 16:58:41 +0000693 _sys.settrace(_trace_hook)
694 if _profile_hook:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000695 self._note("%s._bootstrap(): registering profile hook", self)
Jeremy Hyltonbfccb352003-06-29 16:58:41 +0000696 _sys.setprofile(_profile_hook)
Tim Petersd1b108b2003-06-29 17:24:17 +0000697
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000698 try:
699 self.run()
700 except SystemExit:
701 if __debug__:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000702 self._note("%s._bootstrap(): raised SystemExit", self)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000703 except:
704 if __debug__:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000705 self._note("%s._bootstrap(): unhandled exception", self)
Brett Cannoncc4e9352004-07-03 03:52:35 +0000706 # If sys.stderr is no more (most likely from interpreter
Guido van Rossumd0648992007-08-20 19:25:41 +0000707 # shutdown) use self._stderr. Otherwise still use sys (as in
Brett Cannoncc4e9352004-07-03 03:52:35 +0000708 # _sys) in case sys.stderr was redefined since the creation of
709 # self.
710 if _sys:
711 _sys.stderr.write("Exception in thread %s:\n%s\n" %
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000712 (self.name, _format_exc()))
Brett Cannoncc4e9352004-07-03 03:52:35 +0000713 else:
714 # Do the best job possible w/o a huge amt. of code to
715 # approximate a traceback (code ideas from
716 # Lib/traceback.py)
Guido van Rossumd0648992007-08-20 19:25:41 +0000717 exc_type, exc_value, exc_tb = self._exc_info()
Brett Cannoncc4e9352004-07-03 03:52:35 +0000718 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000719 print((
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000720 "Exception in thread " + self.name +
Guido van Rossumd0648992007-08-20 19:25:41 +0000721 " (most likely raised during interpreter shutdown):"), file=self._stderr)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000722 print((
Guido van Rossumd0648992007-08-20 19:25:41 +0000723 "Traceback (most recent call last):"), file=self._stderr)
Brett Cannoncc4e9352004-07-03 03:52:35 +0000724 while exc_tb:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000725 print((
Brett Cannoncc4e9352004-07-03 03:52:35 +0000726 ' File "%s", line %s, in %s' %
727 (exc_tb.tb_frame.f_code.co_filename,
728 exc_tb.tb_lineno,
Guido van Rossumd0648992007-08-20 19:25:41 +0000729 exc_tb.tb_frame.f_code.co_name)), file=self._stderr)
Brett Cannoncc4e9352004-07-03 03:52:35 +0000730 exc_tb = exc_tb.tb_next
Guido van Rossumd0648992007-08-20 19:25:41 +0000731 print(("%s: %s" % (exc_type, exc_value)), file=self._stderr)
Brett Cannoncc4e9352004-07-03 03:52:35 +0000732 # Make sure that exc_tb gets deleted since it is a memory
733 # hog; deleting everything else is just for thoroughness
734 finally:
735 del exc_type, exc_value, exc_tb
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000736 else:
737 if __debug__:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000738 self._note("%s._bootstrap(): normal return", self)
Christian Heimesbbe741d2008-03-28 10:53:29 +0000739 finally:
740 # Prevent a race in
741 # test_threading.test_no_refcycle_through_target when
742 # the exception keeps the target alive past when we
743 # assert that it's dead.
744 #XXX self.__exc_clear()
745 pass
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000746 finally:
Christian Heimes1af737c2008-01-23 08:24:23 +0000747 with _active_limbo_lock:
748 self._stop()
749 try:
Georg Brandl0c77a822008-06-10 16:37:50 +0000750 # We don't call self._delete() because it also
Christian Heimes1af737c2008-01-23 08:24:23 +0000751 # grabs _active_limbo_lock.
752 del _active[_get_ident()]
753 except:
754 pass
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000755
Guido van Rossumd0648992007-08-20 19:25:41 +0000756 def _stop(self):
Christian Heimes969fe572008-01-25 11:23:10 +0000757 self._block.acquire()
758 self._stopped = True
Benjamin Peterson672b8032008-06-11 19:14:14 +0000759 self._block.notify_all()
Christian Heimes969fe572008-01-25 11:23:10 +0000760 self._block.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000761
Guido van Rossumd0648992007-08-20 19:25:41 +0000762 def _delete(self):
Tim Peters21429932004-07-21 03:36:52 +0000763 "Remove current thread from the dict of currently running threads."
Brett Cannon8b3d92a2004-07-21 02:21:58 +0000764
Georg Brandl2067bfd2008-05-25 13:05:15 +0000765 # Notes about running with _dummy_thread:
Tim Peters21429932004-07-21 03:36:52 +0000766 #
Georg Brandl2067bfd2008-05-25 13:05:15 +0000767 # Must take care to not raise an exception if _dummy_thread is being
Tim Peters21429932004-07-21 03:36:52 +0000768 # used (and thus this module is being used as an instance of
Georg Brandl2067bfd2008-05-25 13:05:15 +0000769 # dummy_threading). _dummy_thread.get_ident() always returns -1 since
770 # there is only one thread if _dummy_thread is being used. Thus
Tim Peters21429932004-07-21 03:36:52 +0000771 # len(_active) is always <= 1 here, and any Thread instance created
772 # overwrites the (if any) thread currently registered in _active.
773 #
774 # An instance of _MainThread is always created by 'threading'. This
775 # gets overwritten the instant an instance of Thread is created; both
Georg Brandl2067bfd2008-05-25 13:05:15 +0000776 # threads return -1 from _dummy_thread.get_ident() and thus have the
Tim Peters21429932004-07-21 03:36:52 +0000777 # same key in the dict. So when the _MainThread instance created by
778 # 'threading' tries to clean itself up when atexit calls this method
779 # it gets a KeyError if another Thread instance was created.
780 #
781 # This all means that KeyError from trying to delete something from
782 # _active if dummy_threading is being used is a red herring. But
783 # since it isn't if dummy_threading is *not* being used then don't
784 # hide the exception.
Brett Cannon8b3d92a2004-07-21 02:21:58 +0000785
Christian Heimes969fe572008-01-25 11:23:10 +0000786 try:
Neal Norwitzf5c7c2e2008-04-05 04:47:45 +0000787 with _active_limbo_lock:
Brett Cannon8b3d92a2004-07-21 02:21:58 +0000788 del _active[_get_ident()]
Neal Norwitzf5c7c2e2008-04-05 04:47:45 +0000789 # There must not be any python code between the previous line
790 # and after the lock is released. Otherwise a tracing function
791 # could try to acquire the lock again in the same thread, (in
Benjamin Peterson672b8032008-06-11 19:14:14 +0000792 # current_thread()), and would block.
Neal Norwitzf5c7c2e2008-04-05 04:47:45 +0000793 except KeyError:
794 if 'dummy_threading' not in _sys.modules:
795 raise
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000796
797 def join(self, timeout=None):
Guido van Rossumd0648992007-08-20 19:25:41 +0000798 if not self._initialized:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000799 raise RuntimeError("Thread.__init__() not called")
Benjamin Peterson672b8032008-06-11 19:14:14 +0000800 if not self._started.is_set():
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000801 raise RuntimeError("cannot join thread before it is started")
Benjamin Peterson672b8032008-06-11 19:14:14 +0000802 if self is current_thread():
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000803 raise RuntimeError("cannot join current thread")
804
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000805 if __debug__:
Guido van Rossumd0648992007-08-20 19:25:41 +0000806 if not self._stopped:
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000807 self._note("%s.join(): waiting until thread stops", self)
Christian Heimes969fe572008-01-25 11:23:10 +0000808
809 self._block.acquire()
810 try:
Brett Cannonad07ff22005-11-23 02:15:50 +0000811 if timeout is None:
Guido van Rossumd0648992007-08-20 19:25:41 +0000812 while not self._stopped:
813 self._block.wait()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000814 if __debug__:
815 self._note("%s.join(): thread stopped", self)
Brett Cannonad07ff22005-11-23 02:15:50 +0000816 else:
817 deadline = _time() + timeout
Guido van Rossumd0648992007-08-20 19:25:41 +0000818 while not self._stopped:
Brett Cannonad07ff22005-11-23 02:15:50 +0000819 delay = deadline - _time()
820 if delay <= 0:
821 if __debug__:
822 self._note("%s.join(): timed out", self)
823 break
Guido van Rossumd0648992007-08-20 19:25:41 +0000824 self._block.wait(delay)
Brett Cannonad07ff22005-11-23 02:15:50 +0000825 else:
826 if __debug__:
827 self._note("%s.join(): thread stopped", self)
Christian Heimes969fe572008-01-25 11:23:10 +0000828 finally:
829 self._block.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000830
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000831 @property
832 def name(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000833 assert self._initialized, "Thread.__init__() not called"
834 return self._name
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000835
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000836 @name.setter
837 def name(self, name):
Guido van Rossumd0648992007-08-20 19:25:41 +0000838 assert self._initialized, "Thread.__init__() not called"
839 self._name = str(name)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000840
Benjamin Peterson773c17b2008-08-18 16:45:31 +0000841 @property
842 def ident(self):
Georg Brandl0c77a822008-06-10 16:37:50 +0000843 assert self._initialized, "Thread.__init__() not called"
844 return self._ident
845
Benjamin Peterson672b8032008-06-11 19:14:14 +0000846 def is_alive(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000847 assert self._initialized, "Thread.__init__() not called"
Benjamin Peterson672b8032008-06-11 19:14:14 +0000848 return self._started.is_set() and not self._stopped
Tim Petersb90f89a2001-01-15 03:26:36 +0000849
Benjamin Petersonb3085c92008-09-01 23:09:31 +0000850 isAlive = is_alive
Benjamin Petersonf0923f52008-08-18 22:10:13 +0000851
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000852 @property
853 def daemon(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000854 assert self._initialized, "Thread.__init__() not called"
855 return self._daemonic
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000856
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000857 @daemon.setter
858 def daemon(self, daemonic):
Guido van Rossumd0648992007-08-20 19:25:41 +0000859 if not self._initialized:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000860 raise RuntimeError("Thread.__init__() not called")
Benjamin Peterson672b8032008-06-11 19:14:14 +0000861 if self._started.is_set():
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000862 raise RuntimeError("cannot set daemon status of active thread");
Guido van Rossumd0648992007-08-20 19:25:41 +0000863 self._daemonic = daemonic
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000864
Benjamin Peterson6640d722008-08-18 18:16:46 +0000865 def isDaemon(self):
866 return self.daemon
867
868 def setDaemon(self, daemonic):
869 self.daemon = daemonic
870
871 def getName(self):
872 return self.name
873
874 def setName(self, name):
875 self.name = name
876
Martin v. Löwis44f86962001-09-05 13:44:54 +0000877# The timer class was contributed by Itamar Shtull-Trauring
878
879def Timer(*args, **kwargs):
880 return _Timer(*args, **kwargs)
881
882class _Timer(Thread):
883 """Call a function after a specified number of seconds:
Tim Petersb64bec32001-09-18 02:26:39 +0000884
Martin v. Löwis44f86962001-09-05 13:44:54 +0000885 t = Timer(30.0, f, args=[], kwargs={})
886 t.start()
887 t.cancel() # stop the timer's action if it's still waiting
888 """
Tim Petersb64bec32001-09-18 02:26:39 +0000889
Martin v. Löwis44f86962001-09-05 13:44:54 +0000890 def __init__(self, interval, function, args=[], kwargs={}):
891 Thread.__init__(self)
892 self.interval = interval
893 self.function = function
894 self.args = args
895 self.kwargs = kwargs
896 self.finished = Event()
Tim Petersb64bec32001-09-18 02:26:39 +0000897
Martin v. Löwis44f86962001-09-05 13:44:54 +0000898 def cancel(self):
899 """Stop the timer if it hasn't finished yet"""
900 self.finished.set()
Tim Petersb64bec32001-09-18 02:26:39 +0000901
Martin v. Löwis44f86962001-09-05 13:44:54 +0000902 def run(self):
903 self.finished.wait(self.interval)
Benjamin Peterson672b8032008-06-11 19:14:14 +0000904 if not self.finished.is_set():
Martin v. Löwis44f86962001-09-05 13:44:54 +0000905 self.function(*self.args, **self.kwargs)
906 self.finished.set()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000907
908# Special thread class to represent the main thread
909# This is garbage collected through an exit handler
910
911class _MainThread(Thread):
912
913 def __init__(self):
914 Thread.__init__(self, name="MainThread")
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000915 self._started.set()
Benjamin Petersond23f8222009-04-05 19:13:16 +0000916 self._set_ident()
917 with _active_limbo_lock:
918 _active[self._ident] = self
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000919
920 def _set_daemon(self):
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000921 return False
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000922
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000923 def _exitfunc(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000924 self._stop()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000925 t = _pickSomeNonDaemonThread()
926 if t:
927 if __debug__:
928 self._note("%s: waiting for other threads", self)
929 while t:
930 t.join()
931 t = _pickSomeNonDaemonThread()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000932 if __debug__:
933 self._note("%s: exiting", self)
Guido van Rossumd0648992007-08-20 19:25:41 +0000934 self._delete()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000935
936def _pickSomeNonDaemonThread():
937 for t in enumerate():
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000938 if not t.daemon and t.is_alive():
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000939 return t
940 return None
941
942
943# Dummy thread class to represent threads not started here.
Tim Peters711906e2005-01-08 07:30:42 +0000944# These aren't garbage collected when they die, nor can they be waited for.
Benjamin Peterson672b8032008-06-11 19:14:14 +0000945# If they invoke anything in threading.py that calls current_thread(), they
Tim Peters711906e2005-01-08 07:30:42 +0000946# leave an entry in the _active dict forever after.
Benjamin Peterson672b8032008-06-11 19:14:14 +0000947# Their purpose is to return *something* from current_thread().
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000948# They are marked as daemon threads so we won't wait for them
949# when we exit (conform previous semantics).
950
951class _DummyThread(Thread):
Tim Petersb90f89a2001-01-15 03:26:36 +0000952
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000953 def __init__(self):
954 Thread.__init__(self, name=_newname("Dummy-%d"))
Tim Peters711906e2005-01-08 07:30:42 +0000955
956 # Thread.__block consumes an OS-level locking primitive, which
957 # can never be used by a _DummyThread. Since a _DummyThread
958 # instance is immortal, that's bad, so release this resource.
Guido van Rossumd0648992007-08-20 19:25:41 +0000959 del self._block
Tim Peters711906e2005-01-08 07:30:42 +0000960
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000961
962 self._started.set()
Benjamin Petersond23f8222009-04-05 19:13:16 +0000963 self._set_ident()
964 with _active_limbo_lock:
965 _active[self._ident] = self
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000966
967 def _set_daemon(self):
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000968 return True
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000969
Neal Norwitz45bec8c2002-02-19 03:01:36 +0000970 def join(self, timeout=None):
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000971 assert False, "cannot join a dummy thread"
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000972
973
974# Global API functions
975
Benjamin Peterson672b8032008-06-11 19:14:14 +0000976def current_thread():
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000977 try:
978 return _active[_get_ident()]
979 except KeyError:
Benjamin Peterson672b8032008-06-11 19:14:14 +0000980 ##print "current_thread(): no current thread for", _get_ident()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000981 return _DummyThread()
982
Benjamin Petersonb3085c92008-09-01 23:09:31 +0000983currentThread = current_thread
Benjamin Petersonf0923f52008-08-18 22:10:13 +0000984
Benjamin Peterson672b8032008-06-11 19:14:14 +0000985def active_count():
Benjamin Petersond23f8222009-04-05 19:13:16 +0000986 with _active_limbo_lock:
987 return len(_active) + len(_limbo)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000988
Benjamin Petersonb3085c92008-09-01 23:09:31 +0000989activeCount = active_count
Benjamin Petersonf0923f52008-08-18 22:10:13 +0000990
Antoine Pitroubdec11f2009-11-05 13:49:14 +0000991def _enumerate():
992 # Same as enumerate(), but without the lock. Internal use only.
993 return list(_active.values()) + list(_limbo.values())
994
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000995def enumerate():
Benjamin Petersond23f8222009-04-05 19:13:16 +0000996 with _active_limbo_lock:
997 return list(_active.values()) + list(_limbo.values())
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000998
Georg Brandl2067bfd2008-05-25 13:05:15 +0000999from _thread import stack_size
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001000
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001001# Create the main thread object,
1002# and make it available for the interpreter
1003# (Py_Main) as threading._shutdown.
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001004
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001005_shutdown = _MainThread()._exitfunc
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001006
Jim Fultond15dc062004-07-14 19:11:50 +00001007# get thread-local implementation, either from the thread
1008# module, or from the python fallback
1009
1010try:
Georg Brandl2067bfd2008-05-25 13:05:15 +00001011 from _thread import _local as local
Jim Fultond15dc062004-07-14 19:11:50 +00001012except ImportError:
1013 from _threading_local import local
1014
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001015
Jesse Nollera8513972008-07-17 16:49:17 +00001016def _after_fork():
1017 # This function is called by Python/ceval.c:PyEval_ReInitThreads which
1018 # is called from PyOS_AfterFork. Here we cleanup threading module state
1019 # that should not exist after a fork.
1020
1021 # Reset _active_limbo_lock, in case we forked while the lock was held
1022 # by another (non-forked) thread. http://bugs.python.org/issue874900
1023 global _active_limbo_lock
1024 _active_limbo_lock = _allocate_lock()
1025
1026 # fork() only copied the current thread; clear references to others.
1027 new_active = {}
1028 current = current_thread()
1029 with _active_limbo_lock:
Antoine Pitrou5fe291f2008-09-06 23:00:03 +00001030 for thread in _active.values():
Jesse Nollera8513972008-07-17 16:49:17 +00001031 if thread is current:
Antoine Pitrou5fe291f2008-09-06 23:00:03 +00001032 # There is only one active thread. We reset the ident to
1033 # its new value since it can have changed.
1034 ident = _get_ident()
1035 thread._ident = ident
Jesse Nollera8513972008-07-17 16:49:17 +00001036 new_active[ident] = thread
1037 else:
1038 # All the others are already stopped.
1039 # We don't call _Thread__stop() because it tries to acquire
1040 # thread._Thread__block which could also have been held while
1041 # we forked.
Antoine Pitrou5fe291f2008-09-06 23:00:03 +00001042 thread._stopped = True
Jesse Nollera8513972008-07-17 16:49:17 +00001043
1044 _limbo.clear()
1045 _active.clear()
1046 _active.update(new_active)
1047 assert len(_active) == 1