Cómo encontrar un ID de hilo en Python

Tengo un progtwig Python de subprocesos múltiples y una función de utilidad, writeLog (mensaje), que escribe una marca de tiempo seguida del mensaje. Desafortunadamente, el archivo de registro resultante no da ninguna indicación de qué hilo está generando qué mensaje.

Me gustaría que writeLog () pueda agregar algo al mensaje para identificar qué hilo lo está llamando. Obviamente, podría hacer que los hilos pasen esta información, pero eso sería mucho más trabajo. ¿Hay algún hilo equivalente de os.getpid () que pueda usar?

Related of "Cómo encontrar un ID de hilo en Python"

threading.get_ident() funciona, o threading.current_thread().ident (o threading.currentThread().ident para Python <2.6).

Usando el módulo de registro , puede agregar automáticamente el identificador de hilo actual en cada entrada de registro. Simplemente use una de estas claves de mapeo LogRecord en su cadena de formato de registrador:

% (hilo) d: ID de hilo (si está disponible).

% (threadName) s: Nombre del hilo (si está disponible).

y configura tu controlador predeterminado con él:

 logging.basicConfig(format="%(threadName)s:%(message)s") 

La función thread.get_ident() devuelve un entero largo en Linux. No es realmente una identificación de hilo.

Utilizo este método para obtener realmente el ID de hilo en Linux:

 import ctypes libc = ctypes.cdll.LoadLibrary('libc.so.6') # System dependent, see eg /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) 

Vi ejemplos de ID de hilos como este:

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

El módulo de subprocesamiento docs también enumera el atributo de 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. 

Puede obtener el ident del hilo actual en ejecución. El ident podría ser reutilizado para otros hilos, si el hilo actual termina.

Cuando creas una instancia de Thread, se asigna un nombre implícito al thread, que es el patrón: Thread-number

El nombre no tiene significado y el nombre no tiene que ser único. El ident de todos los hilos en ejecución es único.

 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() 

La función threading.current_thread () devuelve el hilo en ejecución actual. Este objeto contiene toda la información del hilo.

Creé múltiples hilos en Python, imprimí los objetos de hilo e imprimí el ID utilizando la variable ident . Veo que todas las identificaciones son iguales:

    

De manera similar a @brucexin, necesitaba obtener un identificador de subproceso a nivel del sistema operativo (que! = thread.get_ident() ) y usar algo como el siguiente para no depender de números particulares y ser solo amd64:

 ---- 8< ---- (xos.pyx) """module xos complements standard module os""" cdef extern from "": long syscall(long number, ...) const int SYS_gettid # gettid returns current OS thread identifier. def gettid(): return syscall(SYS_gettid) 

y

 ---- 8< ---- (test.py) import pyximport; pyximport.install() import xos ... print 'my tid: %d' % xos.gettid() 

Esto depende de Cython sin embargo.