web-dev-qa-db-de.com

So finden Sie eine Thread-ID in Python

Ich habe ein Multi-Threading-Python-Programm und eine Dienstprogrammfunktion writeLog (message), die einen Zeitstempel gefolgt von der Nachricht ausschreibt. Leider gibt die resultierende Protokolldatei keinen Hinweis darauf, welcher Thread welche Nachricht generiert. 

Ich möchte, dass writeLog () der Nachricht etwas hinzufügen kann, um zu ermitteln, welcher Thread sie aufruft. Natürlich könnte ich die Threads dazu bringen, diese Informationen weiterzuleiten, aber das wäre viel mehr Arbeit. Gibt es ein Threadäquivalent von os.getpid (), das ich verwenden könnte?

126

threading.get_ident() works oder threading.current_thread() (oder threading.currentThread() für Python <2.6).

159
Nicholas Riley

Mit dem Modul logging können Sie die aktuelle Thread-ID in jedem Protokolleintrag automatisch hinzufügen. Verwenden Sie einfach einen dieser LogRecord Mapping-Schlüssel in Ihrem Logger-Formatstring:

% (thread) d: Thread-ID (falls verfügbar).

% (threadName) s: Threadname (falls verfügbar).

und richten Sie Ihren Standard-Handler damit ein:

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

Die Funktion thread.get_ident() gibt unter Linux eine lange Ganzzahl zurück. Es ist nicht wirklich eine Thread-ID.

Ich benutze diese Methode , um wirklich die Thread-ID unter Linux zu erhalten:

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

Ich sah Beispiele für Thread-IDs wie folgt:

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

Das Threading-Modul docs listet ebenfalls name auf:

...

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

Sie können die ID des aktuell ausgeführten Threads abrufen. Die ID kann für andere Threads wiederverwendet werden, wenn der aktuelle Thread endet.

Wenn Sie eine Instanz von Thread erstellen, wird dem Thread implizit ein Name zugewiesen. Dies ist das Muster: Thread-Nummer

Der Name hat keine Bedeutung und der Name muss nicht eindeutig sein. Die Identität aller laufenden Threads ist eindeutig.

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

Die Funktion threading.current_thread () liefert den aktuell laufenden Thread. Dieses Objekt enthält die gesamte Information des Threads.

1
DeaD_EyE

Ich habe mehrere Threads in Python erstellt, die Thread-Objekte gedruckt und die ID mit der Variablen ident gedruckt. Ich sehe, dass alle IDs gleich sind:

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

Ähnlich wie bei @brucexin musste ich einen Thread-Bezeichner auf Betriebssystemebene abrufen (welcher! = thread.get_ident()) und so etwas wie unten verwenden, um nicht von bestimmten Zahlen abhängig zu sein und nur AMD64 zu verwenden:

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

und

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

...

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

dies hängt jedoch von Cython ab.

0
kirr