blob: 1f638b43c3a454f416d69d1461c9ce0e465974e6 [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
Benjamin Peterson672b8032008-06-11 19:14:14 +000020__all__ = ['active_count', 'Condition', 'current_thread', 'enumerate', 'Event',
Raymond Hettinger5cee47f2011-01-11 19:59:46 +000021 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', 'Barrier',
Victor Stinnerd5c355c2011-04-30 14:53:09 +020022 'Timer', 'setprofile', 'settrace', 'local', 'stack_size']
Guido van Rossum7f5013a1998-04-09 22:01:42 +000023
Raymond Hettinger5cee47f2011-01-11 19:59:46 +000024# Rename some stuff so "from threading import *" is safe
Georg Brandl2067bfd2008-05-25 13:05:15 +000025_start_new_thread = _thread.start_new_thread
26_allocate_lock = _thread.allocate_lock
Victor Stinner2a129742011-05-30 23:02:52 +020027get_ident = _thread.get_ident
Georg Brandl2067bfd2008-05-25 13:05:15 +000028ThreadError = _thread.error
Antoine Pitrou434736a2009-11-10 18:46:01 +000029try:
30 _CRLock = _thread.RLock
31except AttributeError:
32 _CRLock = None
Antoine Pitrou7c3e5772010-04-14 15:44:10 +000033TIMEOUT_MAX = _thread.TIMEOUT_MAX
Georg Brandl2067bfd2008-05-25 13:05:15 +000034del _thread
Guido van Rossum7f5013a1998-04-09 22:01:42 +000035
Guido van Rossum7f5013a1998-04-09 22:01:42 +000036
Tim Peters59aba122003-07-01 20:01:55 +000037# Debug support (adapted from ihooks.py).
Guido van Rossum7f5013a1998-04-09 22:01:42 +000038
Tim Peters0939fac2003-07-01 19:28:44 +000039_VERBOSE = False
Guido van Rossum7f5013a1998-04-09 22:01:42 +000040
41if __debug__:
42
Tim Peters59aba122003-07-01 20:01:55 +000043 class _Verbose(object):
Guido van Rossum7f5013a1998-04-09 22:01:42 +000044
45 def __init__(self, verbose=None):
46 if verbose is None:
47 verbose = _VERBOSE
Guido van Rossumd0648992007-08-20 19:25:41 +000048 self._verbose = verbose
Guido van Rossum7f5013a1998-04-09 22:01:42 +000049
50 def _note(self, format, *args):
Guido van Rossumd0648992007-08-20 19:25:41 +000051 if self._verbose:
Guido van Rossum7f5013a1998-04-09 22:01:42 +000052 format = format % args
Antoine Pitrou401edd62010-12-17 17:42:16 +000053 # Issue #4188: calling current_thread() can incur an infinite
54 # recursion if it has to create a DummyThread on the fly.
Victor Stinner2a129742011-05-30 23:02:52 +020055 ident = get_ident()
Antoine Pitrou401edd62010-12-17 17:42:16 +000056 try:
57 name = _active[ident].name
58 except KeyError:
59 name = "<OS thread %d>" % ident
60 format = "%s: %s\n" % (name, format)
Guido van Rossum7f5013a1998-04-09 22:01:42 +000061 _sys.stderr.write(format)
62
63else:
64 # Disable this when using "python -O"
Tim Peters59aba122003-07-01 20:01:55 +000065 class _Verbose(object):
Guido van Rossum7f5013a1998-04-09 22:01:42 +000066 def __init__(self, verbose=None):
67 pass
68 def _note(self, *args):
69 pass
70
Jeremy Hyltonbfccb352003-06-29 16:58:41 +000071# Support for profile and trace hooks
72
73_profile_hook = None
74_trace_hook = None
75
76def setprofile(func):
77 global _profile_hook
78 _profile_hook = func
Tim Petersd1b108b2003-06-29 17:24:17 +000079
Jeremy Hyltonbfccb352003-06-29 16:58:41 +000080def settrace(func):
81 global _trace_hook
82 _trace_hook = func
Guido van Rossum7f5013a1998-04-09 22:01:42 +000083
84# Synchronization classes
85
86Lock = _allocate_lock
87
Antoine Pitrou434736a2009-11-10 18:46:01 +000088def RLock(verbose=None, *args, **kwargs):
89 if verbose is None:
90 verbose = _VERBOSE
91 if (__debug__ and verbose) or _CRLock is None:
92 return _PyRLock(verbose, *args, **kwargs)
93 return _CRLock(*args, **kwargs)
Guido van Rossum7f5013a1998-04-09 22:01:42 +000094
95class _RLock(_Verbose):
Tim Petersb90f89a2001-01-15 03:26:36 +000096
Guido van Rossum7f5013a1998-04-09 22:01:42 +000097 def __init__(self, verbose=None):
98 _Verbose.__init__(self, verbose)
Guido van Rossumd0648992007-08-20 19:25:41 +000099 self._block = _allocate_lock()
100 self._owner = None
101 self._count = 0
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000102
103 def __repr__(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000104 owner = self._owner
Antoine Pitroub0872682009-11-09 16:08:16 +0000105 try:
106 owner = _active[owner].name
107 except KeyError:
108 pass
109 return "<%s owner=%r count=%d>" % (
110 self.__class__.__name__, owner, self._count)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000111
Antoine Pitrou7c3e5772010-04-14 15:44:10 +0000112 def acquire(self, blocking=True, timeout=-1):
Victor Stinner2a129742011-05-30 23:02:52 +0200113 me = get_ident()
Antoine Pitroub0872682009-11-09 16:08:16 +0000114 if self._owner == me:
Guido van Rossumd0648992007-08-20 19:25:41 +0000115 self._count = self._count + 1
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000116 if __debug__:
117 self._note("%s.acquire(%s): recursive success", self, blocking)
118 return 1
Antoine Pitrou7c3e5772010-04-14 15:44:10 +0000119 rc = self._block.acquire(blocking, timeout)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000120 if rc:
Guido van Rossumd0648992007-08-20 19:25:41 +0000121 self._owner = me
122 self._count = 1
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000123 if __debug__:
Brett Cannon90cece72005-01-27 22:48:30 +0000124 self._note("%s.acquire(%s): initial success", self, blocking)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000125 else:
126 if __debug__:
127 self._note("%s.acquire(%s): failure", self, blocking)
128 return rc
129
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000130 __enter__ = acquire
131
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000132 def release(self):
Victor Stinner2a129742011-05-30 23:02:52 +0200133 if self._owner != get_ident():
Georg Brandl495f7b52009-10-27 15:28:25 +0000134 raise RuntimeError("cannot release un-acquired lock")
Guido van Rossumd0648992007-08-20 19:25:41 +0000135 self._count = count = self._count - 1
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000136 if not count:
Guido van Rossumd0648992007-08-20 19:25:41 +0000137 self._owner = None
138 self._block.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000139 if __debug__:
140 self._note("%s.release(): final release", self)
141 else:
142 if __debug__:
143 self._note("%s.release(): non-final release", self)
144
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000145 def __exit__(self, t, v, tb):
146 self.release()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000147
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000148 # Internal methods used by condition variables
149
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000150 def _acquire_restore(self, state):
Guido van Rossumd0648992007-08-20 19:25:41 +0000151 self._block.acquire()
152 self._count, self._owner = state
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000153 if __debug__:
154 self._note("%s._acquire_restore()", self)
155
156 def _release_save(self):
157 if __debug__:
158 self._note("%s._release_save()", self)
Victor Stinnerc2824d42011-04-24 23:41:33 +0200159 if self._count == 0:
160 raise RuntimeError("cannot release un-acquired lock")
Guido van Rossumd0648992007-08-20 19:25:41 +0000161 count = self._count
162 self._count = 0
163 owner = self._owner
164 self._owner = None
165 self._block.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000166 return (count, owner)
167
168 def _is_owned(self):
Victor Stinner2a129742011-05-30 23:02:52 +0200169 return self._owner == get_ident()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000170
Antoine Pitrou434736a2009-11-10 18:46:01 +0000171_PyRLock = _RLock
172
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000173
174def Condition(*args, **kwargs):
Guido van Rossum68468eb2003-02-27 20:14:51 +0000175 return _Condition(*args, **kwargs)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000176
177class _Condition(_Verbose):
178
179 def __init__(self, lock=None, verbose=None):
180 _Verbose.__init__(self, verbose)
181 if lock is None:
182 lock = RLock()
Guido van Rossumd0648992007-08-20 19:25:41 +0000183 self._lock = lock
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000184 # Export the lock's acquire() and release() methods
185 self.acquire = lock.acquire
186 self.release = lock.release
187 # If the lock defines _release_save() and/or _acquire_restore(),
188 # these override the default implementations (which just call
189 # release() and acquire() on the lock). Ditto for _is_owned().
190 try:
191 self._release_save = lock._release_save
192 except AttributeError:
193 pass
194 try:
195 self._acquire_restore = lock._acquire_restore
196 except AttributeError:
197 pass
198 try:
199 self._is_owned = lock._is_owned
200 except AttributeError:
201 pass
Guido van Rossumd0648992007-08-20 19:25:41 +0000202 self._waiters = []
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000203
Thomas Wouters477c8d52006-05-27 19:21:47 +0000204 def __enter__(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000205 return self._lock.__enter__()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000206
Thomas Wouters477c8d52006-05-27 19:21:47 +0000207 def __exit__(self, *args):
Guido van Rossumd0648992007-08-20 19:25:41 +0000208 return self._lock.__exit__(*args)
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000209
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000210 def __repr__(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000211 return "<Condition(%s, %d)>" % (self._lock, len(self._waiters))
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000212
213 def _release_save(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000214 self._lock.release() # No state to save
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000215
216 def _acquire_restore(self, x):
Guido van Rossumd0648992007-08-20 19:25:41 +0000217 self._lock.acquire() # Ignore saved state
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000218
219 def _is_owned(self):
Benjamin Peterson672b8032008-06-11 19:14:14 +0000220 # Return True if lock is owned by current_thread.
Jeremy Hyltonaf7fde72002-08-14 17:43:59 +0000221 # This method is called only if __lock doesn't have _is_owned().
Guido van Rossumd0648992007-08-20 19:25:41 +0000222 if self._lock.acquire(0):
223 self._lock.release()
Tim Petersbc0e9102002-04-04 22:55:58 +0000224 return False
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000225 else:
Tim Petersbc0e9102002-04-04 22:55:58 +0000226 return True
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000227
228 def wait(self, timeout=None):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000229 if not self._is_owned():
Georg Brandl495f7b52009-10-27 15:28:25 +0000230 raise RuntimeError("cannot wait on un-acquired lock")
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000231 waiter = _allocate_lock()
232 waiter.acquire()
Guido van Rossumd0648992007-08-20 19:25:41 +0000233 self._waiters.append(waiter)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000234 saved_state = self._release_save()
Tim Petersc951bf92001-04-02 20:15:57 +0000235 try: # restore state no matter what (e.g., KeyboardInterrupt)
236 if timeout is None:
237 waiter.acquire()
Georg Brandlb9a43912010-10-28 09:03:20 +0000238 gotit = True
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000239 if __debug__:
Tim Petersc951bf92001-04-02 20:15:57 +0000240 self._note("%s.wait(): got it", self)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000241 else:
Antoine Pitrou7c3e5772010-04-14 15:44:10 +0000242 if timeout > 0:
243 gotit = waiter.acquire(True, timeout)
244 else:
245 gotit = waiter.acquire(False)
Tim Petersc951bf92001-04-02 20:15:57 +0000246 if not gotit:
247 if __debug__:
248 self._note("%s.wait(%s): timed out", self, timeout)
249 try:
Guido van Rossumd0648992007-08-20 19:25:41 +0000250 self._waiters.remove(waiter)
Tim Petersc951bf92001-04-02 20:15:57 +0000251 except ValueError:
252 pass
253 else:
254 if __debug__:
255 self._note("%s.wait(%s): got it", self, timeout)
Georg Brandlb9a43912010-10-28 09:03:20 +0000256 return gotit
Tim Petersc951bf92001-04-02 20:15:57 +0000257 finally:
258 self._acquire_restore(saved_state)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000259
Kristján Valur Jónsson63315202010-11-18 12:46:39 +0000260 def wait_for(self, predicate, timeout=None):
261 endtime = None
262 waittime = timeout
263 result = predicate()
264 while not result:
265 if waittime is not None:
266 if endtime is None:
267 endtime = _time() + waittime
268 else:
269 waittime = endtime - _time()
270 if waittime <= 0:
271 if __debug__:
272 self._note("%s.wait_for(%r, %r): Timed out.",
273 self, predicate, timeout)
274 break
275 if __debug__:
276 self._note("%s.wait_for(%r, %r): Waiting with timeout=%s.",
277 self, predicate, timeout, waittime)
278 self.wait(waittime)
279 result = predicate()
280 else:
281 if __debug__:
282 self._note("%s.wait_for(%r, %r): Success.",
283 self, predicate, timeout)
284 return result
285
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000286 def notify(self, n=1):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000287 if not self._is_owned():
Georg Brandl495f7b52009-10-27 15:28:25 +0000288 raise RuntimeError("cannot notify on un-acquired lock")
Guido van Rossumd0648992007-08-20 19:25:41 +0000289 __waiters = self._waiters
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000290 waiters = __waiters[:n]
291 if not waiters:
292 if __debug__:
293 self._note("%s.notify(): no waiters", self)
294 return
295 self._note("%s.notify(): notifying %d waiter%s", self, n,
296 n!=1 and "s" or "")
297 for waiter in waiters:
298 waiter.release()
299 try:
300 __waiters.remove(waiter)
301 except ValueError:
302 pass
303
Benjamin Peterson672b8032008-06-11 19:14:14 +0000304 def notify_all(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000305 self.notify(len(self._waiters))
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000306
Benjamin Petersonb3085c92008-09-01 23:09:31 +0000307 notifyAll = notify_all
308
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000309
310def Semaphore(*args, **kwargs):
Guido van Rossum68468eb2003-02-27 20:14:51 +0000311 return _Semaphore(*args, **kwargs)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000312
313class _Semaphore(_Verbose):
314
Andrew M. Kuchling39d3bfc2000-02-29 00:10:24 +0000315 # After Tim Peters' semaphore class, but not quite the same (no maximum)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000316
317 def __init__(self, value=1, verbose=None):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000318 if value < 0:
319 raise ValueError("semaphore initial value must be >= 0")
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000320 _Verbose.__init__(self, verbose)
Guido van Rossumd0648992007-08-20 19:25:41 +0000321 self._cond = Condition(Lock())
322 self._value = value
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000323
Antoine Pitrou0454af92010-04-17 23:51:58 +0000324 def acquire(self, blocking=True, timeout=None):
325 if not blocking and timeout is not None:
326 raise ValueError("can't specify timeout for non-blocking acquire")
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000327 rc = False
Antoine Pitrou0454af92010-04-17 23:51:58 +0000328 endtime = None
Guido van Rossumd0648992007-08-20 19:25:41 +0000329 self._cond.acquire()
330 while self._value == 0:
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000331 if not blocking:
332 break
Skip Montanarob446fc72001-08-19 04:25:24 +0000333 if __debug__:
334 self._note("%s.acquire(%s): blocked waiting, value=%s",
Guido van Rossumd0648992007-08-20 19:25:41 +0000335 self, blocking, self._value)
Antoine Pitrou0454af92010-04-17 23:51:58 +0000336 if timeout is not None:
337 if endtime is None:
338 endtime = _time() + timeout
339 else:
340 timeout = endtime - _time()
341 if timeout <= 0:
342 break
343 self._cond.wait(timeout)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000344 else:
Guido van Rossumd0648992007-08-20 19:25:41 +0000345 self._value = self._value - 1
Skip Montanarob446fc72001-08-19 04:25:24 +0000346 if __debug__:
Skip Montanaroae8454a2001-08-19 05:53:47 +0000347 self._note("%s.acquire: success, value=%s",
Guido van Rossumd0648992007-08-20 19:25:41 +0000348 self, self._value)
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000349 rc = True
Guido van Rossumd0648992007-08-20 19:25:41 +0000350 self._cond.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000351 return rc
352
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000353 __enter__ = acquire
354
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000355 def release(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000356 self._cond.acquire()
357 self._value = self._value + 1
Skip Montanarob446fc72001-08-19 04:25:24 +0000358 if __debug__:
Skip Montanaroae8454a2001-08-19 05:53:47 +0000359 self._note("%s.release: success, value=%s",
Guido van Rossumd0648992007-08-20 19:25:41 +0000360 self, self._value)
361 self._cond.notify()
362 self._cond.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000363
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000364 def __exit__(self, t, v, tb):
365 self.release()
Guido van Rossum1a5e21e2006-02-28 21:57:43 +0000366
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000367
Skip Montanaroe428bb72001-08-20 20:27:58 +0000368def BoundedSemaphore(*args, **kwargs):
Guido van Rossum68468eb2003-02-27 20:14:51 +0000369 return _BoundedSemaphore(*args, **kwargs)
Skip Montanaroe428bb72001-08-20 20:27:58 +0000370
371class _BoundedSemaphore(_Semaphore):
372 """Semaphore that checks that # releases is <= # acquires"""
373 def __init__(self, value=1, verbose=None):
374 _Semaphore.__init__(self, value, verbose)
375 self._initial_value = value
376
377 def release(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000378 if self._value >= self._initial_value:
Collin Winterce36ad82007-08-30 01:19:48 +0000379 raise ValueError("Semaphore released too many times")
Skip Montanaroe428bb72001-08-20 20:27:58 +0000380 return _Semaphore.release(self)
381
382
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000383def Event(*args, **kwargs):
Guido van Rossum68468eb2003-02-27 20:14:51 +0000384 return _Event(*args, **kwargs)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000385
386class _Event(_Verbose):
387
388 # After Tim Peters' event class (without is_posted())
389
390 def __init__(self, verbose=None):
391 _Verbose.__init__(self, verbose)
Guido van Rossumd0648992007-08-20 19:25:41 +0000392 self._cond = Condition(Lock())
393 self._flag = False
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000394
Gregory P. Smith9bd4a242011-01-04 18:33:38 +0000395 def _reset_internal_locks(self):
396 # private! called by Thread._reset_internal_locks by _after_fork()
397 self._cond.__init__()
398
Benjamin Peterson672b8032008-06-11 19:14:14 +0000399 def is_set(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000400 return self._flag
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000401
Benjamin Petersonb3085c92008-09-01 23:09:31 +0000402 isSet = is_set
Benjamin Petersonf0923f52008-08-18 22:10:13 +0000403
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000404 def set(self):
Christian Heimes969fe572008-01-25 11:23:10 +0000405 self._cond.acquire()
406 try:
Guido van Rossumd0648992007-08-20 19:25:41 +0000407 self._flag = True
Benjamin Peterson672b8032008-06-11 19:14:14 +0000408 self._cond.notify_all()
Christian Heimes969fe572008-01-25 11:23:10 +0000409 finally:
410 self._cond.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000411
412 def clear(self):
Christian Heimes969fe572008-01-25 11:23:10 +0000413 self._cond.acquire()
414 try:
Guido van Rossumd0648992007-08-20 19:25:41 +0000415 self._flag = False
Christian Heimes969fe572008-01-25 11:23:10 +0000416 finally:
417 self._cond.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000418
419 def wait(self, timeout=None):
Christian Heimes969fe572008-01-25 11:23:10 +0000420 self._cond.acquire()
421 try:
Guido van Rossumd0648992007-08-20 19:25:41 +0000422 if not self._flag:
423 self._cond.wait(timeout)
Benjamin Petersond23f8222009-04-05 19:13:16 +0000424 return self._flag
Christian Heimes969fe572008-01-25 11:23:10 +0000425 finally:
426 self._cond.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000427
Kristján Valur Jónsson3be00032010-10-28 09:43:10 +0000428
429# A barrier class. Inspired in part by the pthread_barrier_* api and
430# the CyclicBarrier class from Java. See
431# http://sourceware.org/pthreads-win32/manual/pthread_barrier_init.html and
432# http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/
433# CyclicBarrier.html
434# for information.
435# We maintain two main states, 'filling' and 'draining' enabling the barrier
436# to be cyclic. Threads are not allowed into it until it has fully drained
437# since the previous cycle. In addition, a 'resetting' state exists which is
438# similar to 'draining' except that threads leave with a BrokenBarrierError,
439# and a 'broken' state in which all threads get get the exception.
440class Barrier(_Verbose):
441 """
442 Barrier. Useful for synchronizing a fixed number of threads
443 at known synchronization points. Threads block on 'wait()' and are
444 simultaneously once they have all made that call.
445 """
446 def __init__(self, parties, action=None, timeout=None, verbose=None):
447 """
448 Create a barrier, initialised to 'parties' threads.
449 'action' is a callable which, when supplied, will be called
450 by one of the threads after they have all entered the
451 barrier and just prior to releasing them all.
452 If a 'timeout' is provided, it is uses as the default for
453 all subsequent 'wait()' calls.
454 """
455 _Verbose.__init__(self, verbose)
456 self._cond = Condition(Lock())
457 self._action = action
458 self._timeout = timeout
459 self._parties = parties
460 self._state = 0 #0 filling, 1, draining, -1 resetting, -2 broken
461 self._count = 0
462
463 def wait(self, timeout=None):
464 """
465 Wait for the barrier. When the specified number of threads have
466 started waiting, they are all simultaneously awoken. If an 'action'
467 was provided for the barrier, one of the threads will have executed
468 that callback prior to returning.
469 Returns an individual index number from 0 to 'parties-1'.
470 """
471 if timeout is None:
472 timeout = self._timeout
473 with self._cond:
474 self._enter() # Block while the barrier drains.
475 index = self._count
476 self._count += 1
477 try:
478 if index + 1 == self._parties:
479 # We release the barrier
480 self._release()
481 else:
482 # We wait until someone releases us
483 self._wait(timeout)
484 return index
485 finally:
486 self._count -= 1
487 # Wake up any threads waiting for barrier to drain.
488 self._exit()
489
490 # Block until the barrier is ready for us, or raise an exception
491 # if it is broken.
492 def _enter(self):
493 while self._state in (-1, 1):
494 # It is draining or resetting, wait until done
495 self._cond.wait()
496 #see if the barrier is in a broken state
497 if self._state < 0:
498 raise BrokenBarrierError
499 assert self._state == 0
500
501 # Optionally run the 'action' and release the threads waiting
502 # in the barrier.
503 def _release(self):
504 try:
505 if self._action:
506 self._action()
507 # enter draining state
508 self._state = 1
509 self._cond.notify_all()
510 except:
511 #an exception during the _action handler. Break and reraise
512 self._break()
513 raise
514
515 # Wait in the barrier until we are relased. Raise an exception
516 # if the barrier is reset or broken.
517 def _wait(self, timeout):
Kristján Valur Jónsson63315202010-11-18 12:46:39 +0000518 if not self._cond.wait_for(lambda : self._state != 0, timeout):
519 #timed out. Break the barrier
520 self._break()
521 raise BrokenBarrierError
522 if self._state < 0:
523 raise BrokenBarrierError
Kristján Valur Jónsson3be00032010-10-28 09:43:10 +0000524 assert self._state == 1
525
526 # If we are the last thread to exit the barrier, signal any threads
527 # waiting for the barrier to drain.
528 def _exit(self):
529 if self._count == 0:
530 if self._state in (-1, 1):
531 #resetting or draining
532 self._state = 0
533 self._cond.notify_all()
534
535 def reset(self):
536 """
537 Reset the barrier to the initial state.
538 Any threads currently waiting will get the BrokenBarrier exception
539 raised.
540 """
541 with self._cond:
542 if self._count > 0:
543 if self._state == 0:
544 #reset the barrier, waking up threads
545 self._state = -1
546 elif self._state == -2:
547 #was broken, set it to reset state
548 #which clears when the last thread exits
549 self._state = -1
550 else:
551 self._state = 0
552 self._cond.notify_all()
553
554 def abort(self):
555 """
556 Place the barrier into a 'broken' state.
557 Useful in case of error. Any currently waiting threads and
558 threads attempting to 'wait()' will have BrokenBarrierError
559 raised.
560 """
561 with self._cond:
562 self._break()
563
564 def _break(self):
565 # An internal error was detected. The barrier is set to
566 # a broken state all parties awakened.
567 self._state = -2
568 self._cond.notify_all()
569
570 @property
571 def parties(self):
572 """
573 Return the number of threads required to trip the barrier.
574 """
575 return self._parties
576
577 @property
578 def n_waiting(self):
579 """
580 Return the number of threads that are currently waiting at the barrier.
581 """
582 # We don't need synchronization here since this is an ephemeral result
583 # anyway. It returns the correct value in the steady state.
584 if self._state == 0:
585 return self._count
586 return 0
587
588 @property
589 def broken(self):
590 """
591 Return True if the barrier is in a broken state
592 """
593 return self._state == -2
594
595#exception raised by the Barrier class
596class BrokenBarrierError(RuntimeError): pass
597
598
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000599# Helper to generate new thread names
600_counter = 0
601def _newname(template="Thread-%d"):
602 global _counter
603 _counter = _counter + 1
604 return template % _counter
605
606# Active thread administration
607_active_limbo_lock = _allocate_lock()
Tim Peters711906e2005-01-08 07:30:42 +0000608_active = {} # maps thread id to Thread object
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000609_limbo = {}
610
611
612# Main class for threads
613
614class Thread(_Verbose):
615
Guido van Rossum8ca162f2002-04-07 06:36:23 +0000616 __initialized = False
Brett Cannoncc4e9352004-07-03 03:52:35 +0000617 # Need to store a reference to sys.exc_info for printing
618 # out exceptions when a thread tries to use a global var. during interp.
619 # shutdown and thus raises an exception about trying to perform some
620 # operation on/with a NoneType
621 __exc_info = _sys.exc_info
Christian Heimesbbe741d2008-03-28 10:53:29 +0000622 # Keep sys.exc_clear too to clear the exception just before
623 # allowing .join() to return.
624 #XXX __exc_clear = _sys.exc_clear
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000625
626 def __init__(self, group=None, target=None, name=None,
Antoine Pitrou0bd4deb2011-02-25 22:07:43 +0000627 args=(), kwargs=None, verbose=None, *, daemon=None):
Guido van Rossum5a43e1a1998-06-09 19:04:26 +0000628 assert group is None, "group argument must be None for now"
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000629 _Verbose.__init__(self, verbose)
Georg Brandla4a8b822005-07-15 09:13:21 +0000630 if kwargs is None:
631 kwargs = {}
Guido van Rossumd0648992007-08-20 19:25:41 +0000632 self._target = target
633 self._name = str(name or _newname())
634 self._args = args
635 self._kwargs = kwargs
Antoine Pitrou0bd4deb2011-02-25 22:07:43 +0000636 if daemon is not None:
637 self._daemonic = daemon
638 else:
639 self._daemonic = current_thread().daemon
Georg Brandl0c77a822008-06-10 16:37:50 +0000640 self._ident = None
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000641 self._started = Event()
Guido van Rossumd0648992007-08-20 19:25:41 +0000642 self._stopped = False
643 self._block = Condition(Lock())
644 self._initialized = True
Brett Cannoncc4e9352004-07-03 03:52:35 +0000645 # sys.stderr is not stored in the class like
646 # sys.exc_info since it can be changed between instances
Guido van Rossumd0648992007-08-20 19:25:41 +0000647 self._stderr = _sys.stderr
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000648
Gregory P. Smith9bd4a242011-01-04 18:33:38 +0000649 def _reset_internal_locks(self):
650 # private! Called by _after_fork() to reset our internal locks as
651 # they may be in an invalid state leading to a deadlock or crash.
652 if hasattr(self, '_block'): # DummyThread deletes _block
653 self._block.__init__()
654 self._started._reset_internal_locks()
655
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000656 def __repr__(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000657 assert self._initialized, "Thread.__init__() was not called"
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000658 status = "initial"
Benjamin Peterson672b8032008-06-11 19:14:14 +0000659 if self._started.is_set():
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000660 status = "started"
Guido van Rossumd0648992007-08-20 19:25:41 +0000661 if self._stopped:
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000662 status = "stopped"
Guido van Rossumd0648992007-08-20 19:25:41 +0000663 if self._daemonic:
Georg Brandl0c77a822008-06-10 16:37:50 +0000664 status += " daemon"
665 if self._ident is not None:
666 status += " %s" % self._ident
Guido van Rossumd0648992007-08-20 19:25:41 +0000667 return "<%s(%s, %s)>" % (self.__class__.__name__, self._name, status)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000668
669 def start(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000670 if not self._initialized:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000671 raise RuntimeError("thread.__init__() not called")
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000672
Benjamin Peterson672b8032008-06-11 19:14:14 +0000673 if self._started.is_set():
Senthil Kumaranfdd4d0f2010-04-06 03:30:18 +0000674 raise RuntimeError("threads can only be started once")
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000675 if __debug__:
676 self._note("%s.start(): starting thread", self)
Benjamin Petersond23f8222009-04-05 19:13:16 +0000677 with _active_limbo_lock:
678 _limbo[self] = self
Gregory P. Smith3fdd9642010-02-28 18:57:46 +0000679 try:
680 _start_new_thread(self._bootstrap, ())
681 except Exception:
682 with _active_limbo_lock:
683 del _limbo[self]
684 raise
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000685 self._started.wait()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000686
687 def run(self):
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000688 try:
689 if self._target:
690 self._target(*self._args, **self._kwargs)
691 finally:
692 # Avoid a refcycle if the thread is running a function with
693 # an argument that has a member that points to the thread.
694 del self._target, self._args, self._kwargs
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000695
Guido van Rossumd0648992007-08-20 19:25:41 +0000696 def _bootstrap(self):
Guido van Rossum61e21b52007-08-20 19:06:03 +0000697 # Wrapper around the real bootstrap code that ignores
698 # exceptions during interpreter cleanup. Those typically
699 # happen when a daemon thread wakes up at an unfortunate
700 # moment, finds the world around it destroyed, and raises some
701 # random exception *** while trying to report the exception in
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000702 # _bootstrap_inner() below ***. Those random exceptions
Guido van Rossum61e21b52007-08-20 19:06:03 +0000703 # don't help anybody, and they confuse users, so we suppress
704 # them. We suppress them only when it appears that the world
705 # indeed has already been destroyed, so that exceptions in
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000706 # _bootstrap_inner() during normal business hours are properly
Guido van Rossum61e21b52007-08-20 19:06:03 +0000707 # reported. Also, we only suppress them for daemonic threads;
708 # if a non-daemonic encounters this, something else is wrong.
709 try:
Guido van Rossumd0648992007-08-20 19:25:41 +0000710 self._bootstrap_inner()
Guido van Rossum61e21b52007-08-20 19:06:03 +0000711 except:
Guido van Rossumd0648992007-08-20 19:25:41 +0000712 if self._daemonic and _sys is None:
Guido van Rossum61e21b52007-08-20 19:06:03 +0000713 return
714 raise
715
Benjamin Petersond23f8222009-04-05 19:13:16 +0000716 def _set_ident(self):
Victor Stinner2a129742011-05-30 23:02:52 +0200717 self._ident = get_ident()
Benjamin Petersond23f8222009-04-05 19:13:16 +0000718
Guido van Rossumd0648992007-08-20 19:25:41 +0000719 def _bootstrap_inner(self):
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000720 try:
Benjamin Petersond23f8222009-04-05 19:13:16 +0000721 self._set_ident()
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000722 self._started.set()
Benjamin Petersond23f8222009-04-05 19:13:16 +0000723 with _active_limbo_lock:
724 _active[self._ident] = self
725 del _limbo[self]
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000726 if __debug__:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000727 self._note("%s._bootstrap(): thread started", self)
Jeremy Hyltonbfccb352003-06-29 16:58:41 +0000728
729 if _trace_hook:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000730 self._note("%s._bootstrap(): registering trace hook", self)
Jeremy Hyltonbfccb352003-06-29 16:58:41 +0000731 _sys.settrace(_trace_hook)
732 if _profile_hook:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000733 self._note("%s._bootstrap(): registering profile hook", self)
Jeremy Hyltonbfccb352003-06-29 16:58:41 +0000734 _sys.setprofile(_profile_hook)
Tim Petersd1b108b2003-06-29 17:24:17 +0000735
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000736 try:
737 self.run()
738 except SystemExit:
739 if __debug__:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000740 self._note("%s._bootstrap(): raised SystemExit", self)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000741 except:
742 if __debug__:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000743 self._note("%s._bootstrap(): unhandled exception", self)
Brett Cannoncc4e9352004-07-03 03:52:35 +0000744 # If sys.stderr is no more (most likely from interpreter
Guido van Rossumd0648992007-08-20 19:25:41 +0000745 # shutdown) use self._stderr. Otherwise still use sys (as in
Brett Cannoncc4e9352004-07-03 03:52:35 +0000746 # _sys) in case sys.stderr was redefined since the creation of
747 # self.
748 if _sys:
749 _sys.stderr.write("Exception in thread %s:\n%s\n" %
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000750 (self.name, _format_exc()))
Brett Cannoncc4e9352004-07-03 03:52:35 +0000751 else:
752 # Do the best job possible w/o a huge amt. of code to
753 # approximate a traceback (code ideas from
754 # Lib/traceback.py)
Guido van Rossumd0648992007-08-20 19:25:41 +0000755 exc_type, exc_value, exc_tb = self._exc_info()
Brett Cannoncc4e9352004-07-03 03:52:35 +0000756 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000757 print((
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000758 "Exception in thread " + self.name +
Guido van Rossumd0648992007-08-20 19:25:41 +0000759 " (most likely raised during interpreter shutdown):"), file=self._stderr)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000760 print((
Guido van Rossumd0648992007-08-20 19:25:41 +0000761 "Traceback (most recent call last):"), file=self._stderr)
Brett Cannoncc4e9352004-07-03 03:52:35 +0000762 while exc_tb:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000763 print((
Brett Cannoncc4e9352004-07-03 03:52:35 +0000764 ' File "%s", line %s, in %s' %
765 (exc_tb.tb_frame.f_code.co_filename,
766 exc_tb.tb_lineno,
Guido van Rossumd0648992007-08-20 19:25:41 +0000767 exc_tb.tb_frame.f_code.co_name)), file=self._stderr)
Brett Cannoncc4e9352004-07-03 03:52:35 +0000768 exc_tb = exc_tb.tb_next
Guido van Rossumd0648992007-08-20 19:25:41 +0000769 print(("%s: %s" % (exc_type, exc_value)), file=self._stderr)
Brett Cannoncc4e9352004-07-03 03:52:35 +0000770 # Make sure that exc_tb gets deleted since it is a memory
771 # hog; deleting everything else is just for thoroughness
772 finally:
773 del exc_type, exc_value, exc_tb
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000774 else:
775 if __debug__:
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000776 self._note("%s._bootstrap(): normal return", self)
Christian Heimesbbe741d2008-03-28 10:53:29 +0000777 finally:
778 # Prevent a race in
779 # test_threading.test_no_refcycle_through_target when
780 # the exception keeps the target alive past when we
781 # assert that it's dead.
782 #XXX self.__exc_clear()
783 pass
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000784 finally:
Christian Heimes1af737c2008-01-23 08:24:23 +0000785 with _active_limbo_lock:
786 self._stop()
787 try:
Georg Brandl0c77a822008-06-10 16:37:50 +0000788 # We don't call self._delete() because it also
Christian Heimes1af737c2008-01-23 08:24:23 +0000789 # grabs _active_limbo_lock.
Victor Stinner2a129742011-05-30 23:02:52 +0200790 del _active[get_ident()]
Christian Heimes1af737c2008-01-23 08:24:23 +0000791 except:
792 pass
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000793
Guido van Rossumd0648992007-08-20 19:25:41 +0000794 def _stop(self):
Christian Heimes969fe572008-01-25 11:23:10 +0000795 self._block.acquire()
796 self._stopped = True
Benjamin Peterson672b8032008-06-11 19:14:14 +0000797 self._block.notify_all()
Christian Heimes969fe572008-01-25 11:23:10 +0000798 self._block.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000799
Guido van Rossumd0648992007-08-20 19:25:41 +0000800 def _delete(self):
Tim Peters21429932004-07-21 03:36:52 +0000801 "Remove current thread from the dict of currently running threads."
Brett Cannon8b3d92a2004-07-21 02:21:58 +0000802
Georg Brandl2067bfd2008-05-25 13:05:15 +0000803 # Notes about running with _dummy_thread:
Tim Peters21429932004-07-21 03:36:52 +0000804 #
Georg Brandl2067bfd2008-05-25 13:05:15 +0000805 # Must take care to not raise an exception if _dummy_thread is being
Tim Peters21429932004-07-21 03:36:52 +0000806 # used (and thus this module is being used as an instance of
Georg Brandl2067bfd2008-05-25 13:05:15 +0000807 # dummy_threading). _dummy_thread.get_ident() always returns -1 since
808 # there is only one thread if _dummy_thread is being used. Thus
Tim Peters21429932004-07-21 03:36:52 +0000809 # len(_active) is always <= 1 here, and any Thread instance created
810 # overwrites the (if any) thread currently registered in _active.
811 #
812 # An instance of _MainThread is always created by 'threading'. This
813 # gets overwritten the instant an instance of Thread is created; both
Georg Brandl2067bfd2008-05-25 13:05:15 +0000814 # threads return -1 from _dummy_thread.get_ident() and thus have the
Tim Peters21429932004-07-21 03:36:52 +0000815 # same key in the dict. So when the _MainThread instance created by
816 # 'threading' tries to clean itself up when atexit calls this method
817 # it gets a KeyError if another Thread instance was created.
818 #
819 # This all means that KeyError from trying to delete something from
820 # _active if dummy_threading is being used is a red herring. But
821 # since it isn't if dummy_threading is *not* being used then don't
822 # hide the exception.
Brett Cannon8b3d92a2004-07-21 02:21:58 +0000823
Christian Heimes969fe572008-01-25 11:23:10 +0000824 try:
Neal Norwitzf5c7c2e2008-04-05 04:47:45 +0000825 with _active_limbo_lock:
Victor Stinner2a129742011-05-30 23:02:52 +0200826 del _active[get_ident()]
Neal Norwitzf5c7c2e2008-04-05 04:47:45 +0000827 # There must not be any python code between the previous line
828 # and after the lock is released. Otherwise a tracing function
829 # could try to acquire the lock again in the same thread, (in
Benjamin Peterson672b8032008-06-11 19:14:14 +0000830 # current_thread()), and would block.
Neal Norwitzf5c7c2e2008-04-05 04:47:45 +0000831 except KeyError:
832 if 'dummy_threading' not in _sys.modules:
833 raise
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000834
835 def join(self, timeout=None):
Guido van Rossumd0648992007-08-20 19:25:41 +0000836 if not self._initialized:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000837 raise RuntimeError("Thread.__init__() not called")
Benjamin Peterson672b8032008-06-11 19:14:14 +0000838 if not self._started.is_set():
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000839 raise RuntimeError("cannot join thread before it is started")
Benjamin Peterson672b8032008-06-11 19:14:14 +0000840 if self is current_thread():
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000841 raise RuntimeError("cannot join current thread")
842
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000843 if __debug__:
Guido van Rossumd0648992007-08-20 19:25:41 +0000844 if not self._stopped:
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000845 self._note("%s.join(): waiting until thread stops", self)
Christian Heimes969fe572008-01-25 11:23:10 +0000846
847 self._block.acquire()
848 try:
Brett Cannonad07ff22005-11-23 02:15:50 +0000849 if timeout is None:
Guido van Rossumd0648992007-08-20 19:25:41 +0000850 while not self._stopped:
851 self._block.wait()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000852 if __debug__:
853 self._note("%s.join(): thread stopped", self)
Brett Cannonad07ff22005-11-23 02:15:50 +0000854 else:
855 deadline = _time() + timeout
Guido van Rossumd0648992007-08-20 19:25:41 +0000856 while not self._stopped:
Brett Cannonad07ff22005-11-23 02:15:50 +0000857 delay = deadline - _time()
858 if delay <= 0:
859 if __debug__:
860 self._note("%s.join(): timed out", self)
861 break
Guido van Rossumd0648992007-08-20 19:25:41 +0000862 self._block.wait(delay)
Brett Cannonad07ff22005-11-23 02:15:50 +0000863 else:
864 if __debug__:
865 self._note("%s.join(): thread stopped", self)
Christian Heimes969fe572008-01-25 11:23:10 +0000866 finally:
867 self._block.release()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000868
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000869 @property
870 def name(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000871 assert self._initialized, "Thread.__init__() not called"
872 return self._name
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000873
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000874 @name.setter
875 def name(self, name):
Guido van Rossumd0648992007-08-20 19:25:41 +0000876 assert self._initialized, "Thread.__init__() not called"
877 self._name = str(name)
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000878
Benjamin Peterson773c17b2008-08-18 16:45:31 +0000879 @property
880 def ident(self):
Georg Brandl0c77a822008-06-10 16:37:50 +0000881 assert self._initialized, "Thread.__init__() not called"
882 return self._ident
883
Benjamin Peterson672b8032008-06-11 19:14:14 +0000884 def is_alive(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000885 assert self._initialized, "Thread.__init__() not called"
Benjamin Peterson672b8032008-06-11 19:14:14 +0000886 return self._started.is_set() and not self._stopped
Tim Petersb90f89a2001-01-15 03:26:36 +0000887
Benjamin Petersonb3085c92008-09-01 23:09:31 +0000888 isAlive = is_alive
Benjamin Petersonf0923f52008-08-18 22:10:13 +0000889
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000890 @property
891 def daemon(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000892 assert self._initialized, "Thread.__init__() not called"
893 return self._daemonic
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000894
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000895 @daemon.setter
896 def daemon(self, daemonic):
Guido van Rossumd0648992007-08-20 19:25:41 +0000897 if not self._initialized:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000898 raise RuntimeError("Thread.__init__() not called")
Benjamin Peterson672b8032008-06-11 19:14:14 +0000899 if self._started.is_set():
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000900 raise RuntimeError("cannot set daemon status of active thread");
Guido van Rossumd0648992007-08-20 19:25:41 +0000901 self._daemonic = daemonic
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000902
Benjamin Peterson6640d722008-08-18 18:16:46 +0000903 def isDaemon(self):
904 return self.daemon
905
906 def setDaemon(self, daemonic):
907 self.daemon = daemonic
908
909 def getName(self):
910 return self.name
911
912 def setName(self, name):
913 self.name = name
914
Martin v. Löwis44f86962001-09-05 13:44:54 +0000915# The timer class was contributed by Itamar Shtull-Trauring
916
917def Timer(*args, **kwargs):
918 return _Timer(*args, **kwargs)
919
920class _Timer(Thread):
921 """Call a function after a specified number of seconds:
Tim Petersb64bec32001-09-18 02:26:39 +0000922
Martin v. Löwis44f86962001-09-05 13:44:54 +0000923 t = Timer(30.0, f, args=[], kwargs={})
924 t.start()
925 t.cancel() # stop the timer's action if it's still waiting
926 """
Tim Petersb64bec32001-09-18 02:26:39 +0000927
Martin v. Löwis44f86962001-09-05 13:44:54 +0000928 def __init__(self, interval, function, args=[], kwargs={}):
929 Thread.__init__(self)
930 self.interval = interval
931 self.function = function
932 self.args = args
933 self.kwargs = kwargs
934 self.finished = Event()
Tim Petersb64bec32001-09-18 02:26:39 +0000935
Martin v. Löwis44f86962001-09-05 13:44:54 +0000936 def cancel(self):
937 """Stop the timer if it hasn't finished yet"""
938 self.finished.set()
Tim Petersb64bec32001-09-18 02:26:39 +0000939
Martin v. Löwis44f86962001-09-05 13:44:54 +0000940 def run(self):
941 self.finished.wait(self.interval)
Benjamin Peterson672b8032008-06-11 19:14:14 +0000942 if not self.finished.is_set():
Martin v. Löwis44f86962001-09-05 13:44:54 +0000943 self.function(*self.args, **self.kwargs)
944 self.finished.set()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000945
946# Special thread class to represent the main thread
947# This is garbage collected through an exit handler
948
949class _MainThread(Thread):
950
951 def __init__(self):
Antoine Pitrou0bd4deb2011-02-25 22:07:43 +0000952 Thread.__init__(self, name="MainThread", daemon=False)
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000953 self._started.set()
Benjamin Petersond23f8222009-04-05 19:13:16 +0000954 self._set_ident()
955 with _active_limbo_lock:
956 _active[self._ident] = self
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000957
Thomas Wouters902d6eb2007-01-09 23:18:33 +0000958 def _exitfunc(self):
Guido van Rossumd0648992007-08-20 19:25:41 +0000959 self._stop()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000960 t = _pickSomeNonDaemonThread()
961 if t:
962 if __debug__:
963 self._note("%s: waiting for other threads", self)
964 while t:
965 t.join()
966 t = _pickSomeNonDaemonThread()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000967 if __debug__:
968 self._note("%s: exiting", self)
Guido van Rossumd0648992007-08-20 19:25:41 +0000969 self._delete()
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000970
971def _pickSomeNonDaemonThread():
972 for t in enumerate():
Benjamin Petersonfdbea962008-08-18 17:33:47 +0000973 if not t.daemon and t.is_alive():
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000974 return t
975 return None
976
977
978# Dummy thread class to represent threads not started here.
Tim Peters711906e2005-01-08 07:30:42 +0000979# These aren't garbage collected when they die, nor can they be waited for.
Benjamin Peterson672b8032008-06-11 19:14:14 +0000980# If they invoke anything in threading.py that calls current_thread(), they
Tim Peters711906e2005-01-08 07:30:42 +0000981# leave an entry in the _active dict forever after.
Benjamin Peterson672b8032008-06-11 19:14:14 +0000982# Their purpose is to return *something* from current_thread().
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000983# They are marked as daemon threads so we won't wait for them
984# when we exit (conform previous semantics).
985
986class _DummyThread(Thread):
Tim Petersb90f89a2001-01-15 03:26:36 +0000987
Guido van Rossum7f5013a1998-04-09 22:01:42 +0000988 def __init__(self):
Antoine Pitrou0bd4deb2011-02-25 22:07:43 +0000989 Thread.__init__(self, name=_newname("Dummy-%d"), daemon=True)
Tim Peters711906e2005-01-08 07:30:42 +0000990
Gregory P. Smith9bd4a242011-01-04 18:33:38 +0000991 # Thread._block consumes an OS-level locking primitive, which
Tim Peters711906e2005-01-08 07:30:42 +0000992 # can never be used by a _DummyThread. Since a _DummyThread
993 # instance is immortal, that's bad, so release this resource.
Guido van Rossumd0648992007-08-20 19:25:41 +0000994 del self._block
Tim Peters711906e2005-01-08 07:30:42 +0000995
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000996 self._started.set()
Benjamin Petersond23f8222009-04-05 19:13:16 +0000997 self._set_ident()
998 with _active_limbo_lock:
999 _active[self._ident] = self
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001000
Neal Norwitz45bec8c2002-02-19 03:01:36 +00001001 def join(self, timeout=None):
Guido van Rossum8ca162f2002-04-07 06:36:23 +00001002 assert False, "cannot join a dummy thread"
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001003
1004
1005# Global API functions
1006
Benjamin Peterson672b8032008-06-11 19:14:14 +00001007def current_thread():
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001008 try:
Victor Stinner2a129742011-05-30 23:02:52 +02001009 return _active[get_ident()]
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001010 except KeyError:
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001011 return _DummyThread()
1012
Benjamin Petersonb3085c92008-09-01 23:09:31 +00001013currentThread = current_thread
Benjamin Petersonf0923f52008-08-18 22:10:13 +00001014
Benjamin Peterson672b8032008-06-11 19:14:14 +00001015def active_count():
Benjamin Petersond23f8222009-04-05 19:13:16 +00001016 with _active_limbo_lock:
1017 return len(_active) + len(_limbo)
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001018
Benjamin Petersonb3085c92008-09-01 23:09:31 +00001019activeCount = active_count
Benjamin Petersonf0923f52008-08-18 22:10:13 +00001020
Antoine Pitroubdec11f2009-11-05 13:49:14 +00001021def _enumerate():
1022 # Same as enumerate(), but without the lock. Internal use only.
1023 return list(_active.values()) + list(_limbo.values())
1024
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001025def enumerate():
Benjamin Petersond23f8222009-04-05 19:13:16 +00001026 with _active_limbo_lock:
1027 return list(_active.values()) + list(_limbo.values())
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001028
Georg Brandl2067bfd2008-05-25 13:05:15 +00001029from _thread import stack_size
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001030
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001031# Create the main thread object,
1032# and make it available for the interpreter
1033# (Py_Main) as threading._shutdown.
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001034
Thomas Wouters902d6eb2007-01-09 23:18:33 +00001035_shutdown = _MainThread()._exitfunc
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001036
Jim Fultond15dc062004-07-14 19:11:50 +00001037# get thread-local implementation, either from the thread
1038# module, or from the python fallback
1039
1040try:
Georg Brandl2067bfd2008-05-25 13:05:15 +00001041 from _thread import _local as local
Jim Fultond15dc062004-07-14 19:11:50 +00001042except ImportError:
1043 from _threading_local import local
1044
Guido van Rossum7f5013a1998-04-09 22:01:42 +00001045
Jesse Nollera8513972008-07-17 16:49:17 +00001046def _after_fork():
1047 # This function is called by Python/ceval.c:PyEval_ReInitThreads which
1048 # is called from PyOS_AfterFork. Here we cleanup threading module state
1049 # that should not exist after a fork.
1050
1051 # Reset _active_limbo_lock, in case we forked while the lock was held
1052 # by another (non-forked) thread. http://bugs.python.org/issue874900
1053 global _active_limbo_lock
1054 _active_limbo_lock = _allocate_lock()
1055
1056 # fork() only copied the current thread; clear references to others.
1057 new_active = {}
1058 current = current_thread()
1059 with _active_limbo_lock:
Antoine Pitrou5fe291f2008-09-06 23:00:03 +00001060 for thread in _active.values():
Jesse Nollera8513972008-07-17 16:49:17 +00001061 if thread is current:
Antoine Pitrou5fe291f2008-09-06 23:00:03 +00001062 # There is only one active thread. We reset the ident to
1063 # its new value since it can have changed.
Victor Stinner2a129742011-05-30 23:02:52 +02001064 ident = get_ident()
Antoine Pitrou5fe291f2008-09-06 23:00:03 +00001065 thread._ident = ident
Gregory P. Smith96c886c2011-01-03 21:06:12 +00001066 # Any condition variables hanging off of the active thread may
1067 # be in an invalid state, so we reinitialize them.
Gregory P. Smith9bd4a242011-01-04 18:33:38 +00001068 thread._reset_internal_locks()
Jesse Nollera8513972008-07-17 16:49:17 +00001069 new_active[ident] = thread
1070 else:
1071 # All the others are already stopped.
1072 # We don't call _Thread__stop() because it tries to acquire
1073 # thread._Thread__block which could also have been held while
1074 # we forked.
Antoine Pitrou5fe291f2008-09-06 23:00:03 +00001075 thread._stopped = True
Jesse Nollera8513972008-07-17 16:49:17 +00001076
1077 _limbo.clear()
1078 _active.clear()
1079 _active.update(new_active)
1080 assert len(_active) == 1