我有一个多线程 Python 程序和一个实用函数 ,writeLog(message)
它会写出时间戳,然后是消息。不幸的是,生成的日志文件没有说明哪个线程正在生成哪个消息。
我希望writeLog()
能够在消息中添加一些内容以识别哪个线程正在调用它。显然我可以让线程传递这些信息,但这需要更多的工作。是否有一些os.getpid()
我可以使用的线程等价物?
我有一个多线程 Python 程序和一个实用函数 ,writeLog(message)
它会写出时间戳,然后是消息。不幸的是,生成的日志文件没有说明哪个线程正在生成哪个消息。
我希望writeLog()
能够在消息中添加一些内容以识别哪个线程正在调用它。显然我可以让线程传递这些信息,但这需要更多的工作。是否有一些os.getpid()
我可以使用的线程等价物?
threading.get_ident()
有效,或threading.current_thread().ident
(或threading.currentThread().ident
对于 Python < 2.6)。
使用日志记录模块,您可以在每个日志条目中自动添加当前线程标识符。只需在记录器格式字符串中使用以下LogRecord映射键之一:
%(thread)d : 线程 ID(如果可用)。
%(threadName)s : 线程名称(如果可用)。
并用它设置你的默认处理程序:
logging.basicConfig(format="%(threadName)s:%(message)s")
该thread.get_ident()
函数在 Linux 上返回一个长整数。这不是一个真正的线程ID。
我使用这种方法来真正获取 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 3.8+ 现在支持此功能:)
您现在可以使用:threading.get_native_id()
https://github.com/python/cpython/commit/4959c33d2555b89b494c678d99be81a65ee864b0
您可以获取当前正在运行的线程的标识。如果当前线程结束,该标识可以被其他线程重用。
当您创建 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() 返回当前正在运行的线程。这个对象保存了线程的全部信息。
我看到了这样的线程 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.
我在 Python 中创建了多个线程,打印了线程对象,并使用ident
变量打印了 id。我看到所有的 id 都是一样的:
<Thread(Thread-1, stopped 140500807628544)>
<Thread(Thread-2, started 140500807628544)>
<Thread(Thread-3, started 140500807628544)>
与@brucexin 类似,我需要获取操作系统级别的线程标识符(其中 != thread.get_ident()
)并使用类似下面的内容不依赖于特定数字并且仅限于 amd64:
---- 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。