Как найти идентификатор потока в Python
У меня есть многопоточная программа Python и служебная функция writeLog(message), которая записывает метку времени, за которой следует сообщение. К сожалению, результирующий файл журнала не указывает, какой поток генерирует какое сообщение.
Я хотел бы writeLog (), чтобы иметь возможность добавить что-то в сообщение, чтобы определить, какой поток вызывает его. Очевидно, я мог бы просто заставить потоки передать эту информацию, но это было бы намного больше работы. Есть ли какая-то нить эквивалент ОС.getpid (), что я мог бы использовать?
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