Как найти идентификатор потока в Python



У меня есть многопоточная программа Python и служебная функция writeLog(message), которая записывает метку времени, за которой следует сообщение. К сожалению, результирующий файл журнала не указывает, какой поток генерирует какое сообщение.



Я хотел бы writeLog (), чтобы иметь возможность добавить что-то в сообщение, чтобы определить, какой поток вызывает его. Очевидно, я мог бы просто заставить потоки передать эту информацию, но это было бы намного больше работы. Есть ли какая-то нить эквивалент ОС.getpid (), что я мог бы использовать?

682   6  

6 ответов:

threading.get_ident() строительство, или threading.current_thread() (или threading.currentThread() для Python

С помощью лесозаготовки

The thread.get_ident() функция возвращает длинное целое число на Linux. Это не совсем идентификатор потока.

Я использую этот метод чтобы действительно получить идентификатор потока в Linux:

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)

Я видел примеры идентификаторов потоков, как это:

class myThread(threading.Thread):
    def __init__(self, threadID, name, counter):
        self.threadID = threadID
        ...

The threading module docs списки а также:

...

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 переменной. Я вижу, что все идентификаторы одинаковы:

<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.

Comments

    Ничего не найдено.