Wie man eine Thread-ID in Python finden
-
06-09-2019 - |
Frage
Ich habe ein Multi-Threading-Python-Programm und eine Nutzenfunktion, writeLog(message)
, die einen Zeitstempel gefolgt von der Nachricht schreibt. Leider gibt die resultierende Protokolldatei keine Hinweise darauf, welche Threads, Nachricht erzeugt.
Ich möchte writeLog()
Lage sein, etwas zu der Nachricht hinzuzufügen, zu identifizieren, welcher Thread es ruft. Offensichtlich könnte ich nur die Fäden diese Informationen in, aber das würde sehr viel mehr Arbeit sein. Gibt es einen Thread Äquivalent os.getpid()
, die ich verwenden könnte?
Lösung
threading.get_ident()
funktioniert, oder threading.current_thread().ident
(oder threading.currentThread().ident
für Python <2.6)
Andere Tipps
die Protokollierung Mit Modul kann die aktuelle Thread-Kennung in jedem Protokolleintrag automatisch hinzufügen . Verwenden Sie einfach eine dieser LogRecord Kartierschlüssel im Logger Format-String:
% (Thread) d. Themen-ID (falls vorhanden)
% (threadName) s. Themen-Name (falls vorhanden)
und Ihre Standard-Handler mit ihm ein:
logging.basicConfig(format="%(threadName)s:%(message)s")
Die thread.get_ident()
Funktion gibt eine lange Ganzzahl auf Linux. Es ist nicht wirklich eine Thread-ID.
Ich verwende diese Methode um wirklich die Thread-ID auf Linux zu bekommen:
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)
Ich sah Beispiele für Thread-IDs wie folgt aus:
class myThread(threading.Thread):
def __init__(self, threadID, name, counter):
self.threadID = threadID
...
Die Einfädeln Listen Modul docs auch name
Attribut:
...
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.
Sie können die ident des laufenden Fadens bekommen. Die ident könnte für andere Threads wieder verwendet werden, wenn der aktuelle Thread beendet ist.
Wenn Sie Kiste eine Instanz des Thread wird ein Name implizit auf den Thread gegeben, das das Muster: Thread-Zahl
Der Name hat keine Bedeutung und der Name muss einzigartig nicht sein. Die ident aller laufenden Threads ist einzigartig.
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 () gibt den laufenden Faden. Dieses Objekt enthält die gesamte Information des Gewindes.
Diese Funktionalität nun von Python unterstützt 3.8+:)
https://github.com/python/cpython/commit/4959c33d2555b89b494c678d99be81a65ee864b0
I mehrere Threads in Python erstellt, gedruckt ich den Thread-Objekte und I gedruckt, um die ID der ident
Variable. Ich sehe alle IDs sind gleich:
<Thread(Thread-1, stopped 140500807628544)>
<Thread(Thread-2, started 140500807628544)>
<Thread(Thread-3, started 140500807628544)>
ähnlich @brucexin ich brauchte OS-Level-Thread-Kennung (die = thread.get_ident()
!) Und verwenden Sie so etwas wie unten nicht abhängig von bestimmten Nummern und seinem amd64-only zu bekommen:
---- 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 ist abhängig von Cython though.