我有一个多线程Python程序和一个实用函数writeLog(message),它写出一个时间戳,后跟消息。不幸的是,生成的日志文件没有显示哪个线程正在生成哪个消息。
我希望writeLog()能够向消息添加一些内容,以确定哪个线程正在调用它。显然,我可以让线程传递这个信息,但这将是更多的工作。是否有一些线程等效的os.getpid(),我可以使用?
我有一个多线程Python程序和一个实用函数writeLog(message),它写出一个时间戳,后跟消息。不幸的是,生成的日志文件没有显示哪个线程正在生成哪个消息。
我希望writeLog()能够向消息添加一些内容,以确定哪个线程正在调用它。显然,我可以让线程传递这个信息,但这将是更多的工作。是否有一些线程等效的os.getpid(),我可以使用?
当前回答
类似于@brucexin,我需要获得操作系统级别的线程标识符(which != 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)
and
---- 8< ---- (test.py)
import pyximport; pyximport.install()
import xos
...
print 'my tid: %d' % xos.gettid()
这取决于Cython。
其他回答
我看到线程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(或threading.currentThread()。Python < 2.6的标识)。
Python 3.8+现在支持此功能:)
你现在可以使用:threading.get_native_id()
https://github.com/python/cpython/commit/4959c33d2555b89b494c678d99be81a65ee864b0
https://github.com/python/cpython/pull/11993
类似于@brucexin,我需要获得操作系统级别的线程标识符(which != 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)
and
---- 8< ---- (test.py)
import pyximport; pyximport.install()
import xos
...
print 'my tid: %d' % xos.gettid()
这取决于Cython。
我在Python中创建了多个线程,打印了线程对象,并使用ident变量打印了id。我看到所有的id都一样
<Thread(Thread-1, stopped 140500807628544)>
<Thread(Thread-2, started 140500807628544)>
<Thread(Thread-3, started 140500807628544)>