diff options
author | Jake Tesler <jake.tesler@gmail.com> | 2019-05-12 17:08:24 (GMT) |
---|---|---|
committer | Antoine Pitrou <antoine@python.org> | 2019-05-12 17:08:24 (GMT) |
commit | 4959c33d2555b89b494c678d99be81a65ee864b0 (patch) | |
tree | 87df7778f170864ef1efe3418ac3cb3c47051c50 /Lib/threading.py | |
parent | 87068ed00927bdeaa2ae556e4241c16cf8a845eb (diff) | |
download | cpython-4959c33d2555b89b494c678d99be81a65ee864b0.zip cpython-4959c33d2555b89b494c678d99be81a65ee864b0.tar.gz cpython-4959c33d2555b89b494c678d99be81a65ee864b0.tar.bz2 |
bpo-36084: Add native thread ID to threading.Thread objects (GH-11993)
Diffstat (limited to 'Lib/threading.py')
-rw-r--r-- | Lib/threading.py | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/Lib/threading.py b/Lib/threading.py index 0ebbd67..3137e49 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -23,8 +23,8 @@ except ImportError: # with the multiprocessing module, which doesn't provide the old # Java inspired names. -__all__ = ['get_ident', 'active_count', 'Condition', 'current_thread', - 'enumerate', 'main_thread', 'TIMEOUT_MAX', +__all__ = ['get_ident', 'get_native_id', 'active_count', 'Condition', + 'current_thread', 'enumerate', 'main_thread', 'TIMEOUT_MAX', 'Event', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread', 'Barrier', 'BrokenBarrierError', 'Timer', 'ThreadError', 'setprofile', 'settrace', 'local', 'stack_size'] @@ -34,6 +34,7 @@ _start_new_thread = _thread.start_new_thread _allocate_lock = _thread.allocate_lock _set_sentinel = _thread._set_sentinel get_ident = _thread.get_ident +get_native_id = _thread.get_native_id ThreadError = _thread.error try: _CRLock = _thread.RLock @@ -790,6 +791,7 @@ class Thread: else: self._daemonic = current_thread().daemon self._ident = None + self._native_id = 0 self._tstate_lock = None self._started = Event() self._is_stopped = False @@ -891,6 +893,9 @@ class Thread: def _set_ident(self): self._ident = get_ident() + def _set_native_id(self): + self._native_id = get_native_id() + def _set_tstate_lock(self): """ Set a lock object which will be released by the interpreter when @@ -903,6 +908,7 @@ class Thread: try: self._set_ident() self._set_tstate_lock() + self._set_native_id() self._started.set() with _active_limbo_lock: _active[self._ident] = self @@ -1077,6 +1083,17 @@ class Thread: assert self._initialized, "Thread.__init__() not called" return self._ident + @property + def native_id(self): + """Native integral thread ID of this thread or 0 if it has not been started. + + This is a non-negative integer. See the get_native_id() function. + This represents the Thread ID as reported by the kernel. + + """ + assert self._initialized, "Thread.__init__() not called" + return self._native_id + def is_alive(self): """Return whether the thread is alive. @@ -1176,6 +1193,7 @@ class _MainThread(Thread): self._set_tstate_lock() self._started.set() self._set_ident() + self._set_native_id() with _active_limbo_lock: _active[self._ident] = self @@ -1195,6 +1213,7 @@ class _DummyThread(Thread): self._started.set() self._set_ident() + self._set_native_id() with _active_limbo_lock: _active[self._ident] = self |