¿Cómo obtener una identificación de hilo en Python?

1 minuto de lectura

avatar de usuario
carlos anderson

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

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

avatar de usuario
Nicolás Riley

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

  • Corregido tus enlaces Nicolás. Recientemente me di cuenta de que si pasa el cursor sobre un título en los documentos, aparece un pequeño símbolo rojo a la derecha. Copie y pegue eso para enlaces más específicos a los documentos 🙂

    – Jon Cage

    28 de mayo de 2009 a las 9:31

  • Tenga en cuenta que si está utilizando Jython, desea threading.currentThread() (camelCase, no camel_case) a partir de la versión 2.5.

    –Cam Jackson

    31 de agosto de 2011 a las 2:45

  • @CharlesAnderson cuidado, los documentos de python en Subproceso.nombre say “name – Una cadena utilizada solo con fines de identificación. No tiene semántica. Múltiples subprocesos pueden recibir el mismo nombre. El nombre inicial lo establece el constructor”.

    – drevicko

    4 de diciembre de 2012 a las 6:10

  • También tenga en cuenta que al menos en Python 2.5 y 2.6 en OS X, parece haber un error en el que threading.current_thread().ident es inapropiado None. Probablemente tiene sentido solo usar thread.get_ident() en Python 2 y threading.current_thread().ident en Phyton 3.

    – Nicolás Riley

    4 de diciembre de 2012 a las 9:50

  • Versiones anteriores de mi respuesta. hizo mencion thread.get_ident() (threading.get_ident() se agregó en Python 3.3; siga los enlaces a la documentación).

    – Nicolás Riley

    14/01/2017 a las 17:00

avatar de usuario
kraymer

Utilizando el Inicio sesión módulo puede agregar automáticamente el identificador de subproceso actual en cada entrada de registro. Solo usa uno de estos LogRecord asignación de claves en la cadena de formato de su registrador:

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

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

y configure su controlador predeterminado con él:

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

  • Estoy usando registrador. Así que creo que tu respuesta es la solución más simple. pero estoy recibiendo <concurrent.futures.thread.ThreadPoolExecutor object at 0x7f00f882a438>_2 esto como un nombre de hilo. Es que dos es mi número de hilo que invocó

    – Ravi Shanker Reddy

    30 de mayo de 2017 a las 5:06


avatar de usuario
brucexina

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

yo suelo este método para obtener realmente la identificación del hilo en 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)

  • Esto se puede usar a veces pero no es portátil

    – Piyush Kansal

    25 de febrero de 2012 a las 20:51

  • ¿Podría editar esta respuesta para que siga siendo útil para los visitantes si el enlace se daña?

    – josliber

    29 de junio de 2016 a las 12:51

  • ¿Cómo envolver el método start () de mi clase de hilo para que pueda llenar mi self.pid con su pid cada vez que lanzo el hilo? Intenté os.kill (pid) desde dentro del propio subproceso, simplemente detiene todos los subprocesos, incluido el principal, debe hacerlo externamente el padre, pero ¿cómo obtener ese pid secundario del padre?

    –Rodrigo Formighieri

    27 de febrero de 2019 a las 12:41


  • Como otros han insinuado, lamentablemente esto no funciona en algo como un Linux integrado que se ejecuta en un brazo de 32 bits.

    – Travis Griggs

    23 de septiembre de 2019 a las 23:48

  • @TravisGriggs El concepto es portátil para Linux, incluidas las plataformas ARM de 32 bits. Solo necesita obtener el número de llamada del sistema correcto, que probablemente sea 224 en ARM y ARM64. Podría determinarse en tiempo de compilación o ejecución con un pequeño programa en C. Esto me funciona con Python 3.7 en un RPi. La respuesta de Jake Tesler es mejor si tiene Python 3.8, que aún no está presente en Raspbian 10.

    – TrentP

    3 de diciembre de 2019 a las 22:19

avatar de usuario
jake tesler

Esta funcionalidad ahora es compatible con Python 3.8+ 🙂

Ahora puedes usar: threading.get_native_id()

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

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

Puede obtener la identificación del subproceso en ejecución actual. El ident podría reutilizarse para otros subprocesos, si el subproceso actual finaliza.

Cuando crea una instancia de Thread, se le da un nombre implícito al hilo, que es el patrón: Thread-number

El nombre no tiene significado y el nombre no tiene que ser único. La identificación de todos los subprocesos en ejecución es única.

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 actual en ejecución. Este objeto contiene toda la información del hilo.

avatar de usuario
miku

Vi ejemplos de ID de hilos como este:

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

los documentación del módulo de subprocesos liza name atributo también:

...

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.

avatar de usuario
Pedro Mortensen

Creé varios subprocesos en Python, imprimí los objetos del subproceso e imprimí la identificación usando el ident variable. Veo que todos los id son iguales:

<Thread(Thread-1, stopped 140500807628544)>
<Thread(Thread-2, started 140500807628544)>
<Thread(Thread-3, started 140500807628544)>

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad