提问人:Charles Anderson 提问时间:5/28/2009 最后编辑:ivanleonczCharles Anderson 更新时间:10/19/2023 访问量:363345
如何在Python中获取线程ID?
How to obtain a Thread id in Python?
问:
我有一个多线程 Python 程序和一个实用程序函数,它写出一个时间戳,然后是消息。遗憾的是,生成的日志文件没有指示哪个线程正在生成哪个消息。writeLog(message)
我希望能够在消息中添加一些东西,以确定哪个线程正在调用它。显然,我可以让线程传递这些信息,但那将是更多的工作。有没有一些等效于我可以使用的线程?writeLog()
os.getpid()
答:
我看到了这样的线程 ID 示例:
class myThread(threading.Thread):
def __init__(self, threadID, name, counter):
self.threadID = threadID
...
线程模块文档也列出了属性:name
...
A thread has a name.
The name can be passed to the constructor,
and read or changed through the name attribute.
...
Thread.name
A string used for identification purposes only.
It has no semantics. Multiple threads may
be given the same name. The initial name is set by the constructor.
评论
threading.get_ident(
) 有效,或者 threading.current_thread().ident(
或用于 Python < 2.6)。threading.currentThread().ident
评论
threading.currentThread()
threading.current_thread().ident
None
thread.get_ident()
threading.current_thread().ident
thread.get_ident()
threading.get_ident()
使用日志记录模块,您可以在每个日志条目中自动添加当前线程标识符。 只需在记录器格式字符串中使用以下 LogRecord 映射键之一:
%(螺纹)d :线程 ID(如果可用)。
%(线程名称)s :线程名称(如果可用)。
并用它设置默认处理程序:
logging.basicConfig(format="%(threadName)s:%(message)s")
评论
<concurrent.futures.thread.ThreadPoolExecutor object at 0x7f00f882a438>_2
该函数在 Linux 上返回一个长整数。它不是真正的线程 ID。threading.get_ident()
我使用这种方法在 Linux 上真正获取线程 ID:
import ctypes
libc = ctypes.cdll.LoadLibrary('libc.so.6')
# System dependent, see e.g. /usr/include/x86_64-linux-gnu/asm/unistd_64.h
SYS_gettid = 186
def getThreadId():
"""Returns OS thread id - Specific to Linux"""
return libc.syscall(SYS_gettid)
评论
我在 Python 中创建了多个线程,打印了线程对象,并使用变量打印了 id。我看到所有的id都是一样的:ident
<Thread(Thread-1, stopped 140500807628544)>
<Thread(Thread-2, started 140500807628544)>
<Thread(Thread-3, started 140500807628544)>
评论
ident
Thread identifiers may be recycled when a thread exits and another thread is created.
与@brucexin类似,我需要获取操作系统级别的线程标识符(其中 != )并使用如下所示的东西来不依赖于特定数字并且仅 amd64:thread.get_ident()
---- 8< ---- (xos.pyx)
"""module xos complements standard module os"""
cdef extern from "<sys/syscall.h>":
long syscall(long number, ...)
const int SYS_gettid
# gettid returns current OS thread identifier.
def gettid():
return syscall(SYS_gettid)
和
---- 8< ---- (test.py)
import pyximport; pyximport.install()
import xos
...
print 'my tid: %d' % xos.gettid()
不过,这取决于Cython。
评论
invalid syntax
extern
.pyx
您可以获取当前正在运行的线程的标识。如果当前线程结束,则 ident 可以重用于其他线程。
当您创建 Thread 的实例时,会为线程提供一个隐式名称,即模式:Thread-number
名称没有意义,名称不必是唯一的。所有正在运行的线程的标识都是唯一的。
import threading
def worker():
print(threading.current_thread().name)
print(threading.get_ident())
threading.Thread(target=worker).start()
threading.Thread(target=worker, name='foo').start()
函数 threading.current_thread() 返回当前正在运行的线程。此对象包含线程的全部信息。
评论
Python 3.8+ 现在支持此功能:)
您现在可以使用:threading.get_native_id()
https://github.com/python/cpython/commit/4959c33d2555b89b494c678d99be81a65ee864b0
https://github.com/python/cpython/pull/11993
评论
.get_ident()
.get_native_id()
评论