web-dev-qa-db-fra.com

Comment trouver un identifiant de thread en Python

J'ai un programme Python multi-threading et une fonction utilitaire writeLog (message) qui écrit un horodatage suivi du message. Malheureusement, le fichier journal résultant n'indique pas quel thread génère quel message. 

J'aimerais que writeLog () puisse ajouter quelque chose au message pour identifier le fil qui l'appelle. Évidemment, je pourrais simplement faire en sorte que les discussions transmettent cette information, mais ce serait beaucoup plus de travail. Existe-t-il un équivalent fil de os.getpid () que je pourrais utiliser?

126
Charles Anderson

threading.get_ident() works, ou threading.current_thread() (ou threading.currentThread() pour Python <2.6).

159
Nicholas Riley

En utilisant le module logging , vous pouvez ajouter automatiquement l’identificateur de thread actuel dans chaque entrée du journal. Utilisez simplement l’une de ces clés LogRecord dans votre chaîne de formatage:

% (thread) d: ID de thread (si disponible).

% (threadName) s: Nom du thread (si disponible).

et configurez votre gestionnaire par défaut avec:

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

La fonction thread.get_ident() renvoie un entier long sous Linux. Ce n'est pas vraiment un identifiant de fil.

J'utilise cette méthode pour vraiment obtenir l'id du thread sous 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)
20
brucexin

J'ai vu des exemples d'ID de threads comme ceci:

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

Le threading module docs lists name attribut ainsi:

...

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.
6
miku
2
Jake Tesler

Vous pouvez obtenir l'identifiant du thread en cours d'exécution. L'identifiant peut être réutilisé pour d'autres threads, si le thread actuel se termine.

Lorsque vous créez une instance de Thread, un nom est donné implicitement au thread, qui correspond au motif: Thread-number

Le nom n'a aucune signification et le nom ne doit pas nécessairement être unique. L'identité de tous les threads en cours d'exécution est unique.

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 fonction threading.current_thread () renvoie le thread en cours d'exécution. Cet objet contient toutes les informations du fil.

1
DeaD_EyE

J'ai créé plusieurs threads en Python, j'ai imprimé les objets thread et l'identifiant à l'aide de la variable ident. Je vois que tous les identifiants sont les mêmes:

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

De la même manière que @brucexin, je devais obtenir l'identifiant de thread au niveau du système d'exploitation (qui!! = thread.get_ident()) et utiliser le même principe que ci-dessous pour ne pas dépendre de nombres particuliers et être uniquement 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)                                                                  

et

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

...

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

cela dépend de Cython cependant.

0
kirr