Answers:
threading.get_ident()
,或threading.current_thread().ident
(或(threading.currentThread().ident
对于python <2.6)。
threading.currentThread()
要从2.5版开始(camelCase,而不是camel_case)。
threading.current_thread().ident
是不恰当的None
。可能是有道理只使用thread.get_ident()
在Python 2和threading.current_thread().ident
Python中的3
thread.get_ident()
(threading.get_ident()
已在Python 3.3中添加-请点击文档链接)。
使用日志记录模块,您可以在每个日志条目中自动添加当前线程标识符。只需在记录器格式字符串中使用以下LogRecord映射键之一:
%(thread)d: 线程ID(如果有)。
%(threadName)s: 线程名称(如果有)。
并使用它设置默认处理程序:
logging.basicConfig(format="%(threadName)s:%(message)s")
<concurrent.futures.thread.ThreadPoolExecutor object at 0x7f00f882a438>_2
将此作为线程名称。那是我调用的线程号吗?
该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)
我看到了这样的线程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.
您可以获得当前正在运行的线程的标识。如果当前线程结束,则该标识可以重用于其他线程。
创建线程实例时,将为该线程隐式指定一个名称,即模式:线程号
名称没有意义,名称不必唯一。所有正在运行的线程的标识都是唯一的。
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中创建了多个线程,打印了线程对象,并使用ident
变量打印了id 。我看到所有ID都一样:
<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.
docs.python.org/2/library/threading.html#threading.Thread.ident
与@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。
invalid syntax
指向extern
关键字的指针。有什么我想念的吗?将代码放在单独的模块中并具有pyx扩展是否重要?还是这是(重新)编译的东西?
.pyx
文件中。对于“纯python”,可能也可以使用ctypes做类似的事情。