229

我有一个多线程 Python 程序和一个实用函数 ,writeLog(message)它会写出时间戳,然后是消息。不幸的是,生成的日志文件没有说明哪个线程正在生成哪个消息。

我希望writeLog()能够在消息中添加一些内容以识别哪个线程正在调用它。显然我可以让线程传递这些信息,但这需要更多的工作。是否有一些os.getpid()我可以使用的线程等价物?

4

8 回答 8

304

threading.get_ident()有效,或threading.current_thread().ident(或threading.currentThread().ident对于 Python < 2.6)。

于 2009-05-28T09:13:40.153 回答
80

使用日志记录模块,您可以在每个日志条目中自动添加当前线程标识符。只需在记录器格式字符串中使用以下LogRecord映射键之一:

%(thread)d : 线程 ID(如果可用)。

%(threadName)s : 线程名称(如果可用)。

并用它设置你的默认处理程序:

logging.basicConfig(format="%(threadName)s:%(message)s")
于 2010-03-01T17:19:18.040 回答
28

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)
于 2012-02-23T09:17:44.650 回答
20

Python 3.8+ 现在支持此功能:)

您现在可以使用:threading.get_native_id()

https://github.com/python/cpython/commit/4959c33d2555b89b494c678d99be81a65ee864b0

https://github.com/python/cpython/pull/11993

于 2019-05-12T17:26:24.803 回答
15

您可以获取当前正在运行的线程的标识。如果当前线程结束,该标识可以被其他线程重用。

当您创建 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() 返回当前正在运行的线程。这个对象保存了线程的全部信息。

于 2019-03-08T09:46:24.033 回答
7

我看到了这样的线程 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.
于 2009-05-28T09:11:13.203 回答
0

我在 Python 中创建了多个线程,打印了线程对象,并使用ident变量打印了 id。我看到所有的 id 都是一样的:

<Thread(Thread-1, stopped 140500807628544)>
<Thread(Thread-2, started 140500807628544)>
<Thread(Thread-3, started 140500807628544)>
于 2015-06-19T05:31:39.023 回答
0

与@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。

于 2018-03-07T13:04:32.890 回答