Pregunta

Tengo un programa multi-threading Python, y una función de utilidad, writeLog(message), que escribe una marca de tiempo seguido por el mensaje. Desafortunadamente, el archivo de registro resultante no da ninguna indicación de que el hilo está generando que mensaje.

Me gustaría writeLog() para poder añadir algo al mensaje para identificar cuál de ellos lo está llamando. Obviamente, yo podía distinguir los hilos pasan esta información, pero eso sería mucho más trabajo. ¿Hay algún hilo equivalente de os.getpid() que podría utilizar?

¿Fue útil?

Solución

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

Otros consejos

Uso de la tala módulo Se puede añadir automáticamente el identificador del hilo actual en cada entrada de registro . Sólo tiene que utilizar uno de estos LogRecord teclas de mapeo en su cadena de formato registrador:

  

% (thread) d:. ID Thread (si está disponible)

     

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

y configurar el controlador predeterminado con ella:

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

La función thread.get_ident() devuelve un entero largo en Linux. No es realmente una ID del tema.

este método para conseguir realmente el ID del tema 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)

vi ejemplos de los ID de hilo como este:

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

Los href="http://docs.python.org/library/threading.html#threading.Thread.name" roscado listas docs módulo name atribuir así:

...

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 la ident del hilo de ejecución actual. El ident podría ser reutilizado para otros hilos, si termina el subproceso actual.

Al crear una nueva instancia de hilo, un nombre se da implícita al hilo, que es el patrón: Hilo de números

El nombre no tiene ningún significado y el nombre no tiene que ser único. El Código nacional de todos los subprocesos que se ejecutan 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()

El threading.current_thread función () devuelve el hilo de ejecución actual. Este objeto contiene toda la información de la rosca.

I creado múltiples hilos en Python, imprimí los objetos de rosca, y imprime el Id utilizando la variable ident. Veo todos los identificadores son los mismos:

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

Al igual que en @brucexin que necesitaba para obtener el identificador de hilo a nivel de sistema operativo (que thread.get_ident() =!) Y usar algo como a continuación no depender de números particulares y ser amd64 solamente:

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

y

---- 8< ---- (test.py)
import pyximport; pyximport.install()
import xos

...

print 'my tid: %d' % xos.gettid()

esto depende de Cython sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top