Ich habe ein Multithreading-Python-Programm und eine Hilfsfunktion, writeLog(message), die einen Zeitstempel gefolgt von der Nachricht ausgibt. Leider gibt die resultierende Protokolldatei keinen Hinweis darauf, welcher Thread welche Nachricht generiert.
Ich möchte writeLog() in der Lage zu sein, der Nachricht etwas hinzuzufügen, um zu identifizieren, welcher Thread sie aufruft. Natürlich könnte ich die Threads dazu bringen, diese Informationen weiterzugeben, aber das wäre viel mehr Arbeit. Gibt es ein Thread-Äquivalent von os.getpid() die ich verwenden könnte?
Korrigierte Ihre Links Nicholas. Ich habe kürzlich festgestellt, dass, wenn Sie mit der Maus über einen Titel in den Dokumenten fahren, rechts ein kleines rotes Symbol erscheint. Kopieren Sie das und fügen Sie es ein, um spezifischere Links zu den Dokumenten zu erhalten 🙂
– Jon Cage
28. Mai 2009 um 9:31 Uhr
Beachten Sie, dass Sie dies möchten, wenn Sie Jython verwenden threading.currentThread() (camelCase, nicht camel_case) ab Version 2.5.
– Cam Jackson
31. August 2011 um 2:45 Uhr
@CharlesAnderson Vorsicht, die Python-Dokumentation an Thema.name say “name – Eine Zeichenfolge, die nur zu Identifikationszwecken verwendet wird. Sie hat keine Semantik. Mehreren Threads kann derselbe Name gegeben werden. Der anfängliche Name wird vom Konstruktor festgelegt.”
– Dreviko
4. Dezember 2012 um 6:10 Uhr
Beachten Sie auch, dass es zumindest in Python 2.5 und 2.6 unter OS X einen Fehler zu geben scheint threading.current_thread().ident ist unangemessen None. Wahrscheinlich macht es Sinn, nur zu verwenden thread.get_ident() in Python 2 und threading.current_thread().ident in Python3.
– Nikolaus Riley
4. Dezember 2012 um 9:50 Uhr
Frühere Versionen meiner Antwort tat nennen thread.get_ident() (threading.get_ident() wurde in Python 3.3 hinzugefügt — folgen Sie den Links zur Dokumentation).
– Nikolaus Riley
14. Januar 2017 um 17:00 Uhr
krämer
Verwendung der Protokollierung Modul können Sie automatisch die aktuelle Thread-Kennung in jedem Protokolleintrag hinzufügen. Verwenden Sie einfach eine davon LogRecord Zuordnungsschlüssel in Ihrer Logger-Formatzeichenfolge:
Ich verwende Logger. Also denke ich, dass Ihre Antwort die einfachste Lösung ist. Aber ich bekomme <concurrent.futures.thread.ThreadPoolExecutor object at 0x7f00f882a438>_2 dies als Thread-Name. Ist das zwei, ist meine Thread-Nummer, die aufgerufen wurde
– Ravi Shanker Reddy
30. Mai 2017 um 5:06 Uhr
Brucexin
Das thread.get_ident() Die Funktion gibt unter Linux eine lange ganze Zahl zurück. Es ist nicht wirklich eine Thread-ID.
ich benutze diese Methode um die Thread-ID unter Linux wirklich 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)
Dies kann manchmal verwendet werden, ist aber nicht tragbar
– Piyush Kansal
25. Februar 2012 um 20:51 Uhr
Könnten Sie diese Antwort bitte bearbeiten, damit sie für Besucher weiterhin nützlich ist, wenn der Link schlecht wird?
– Josliber ♦
29. Juni 2016 um 12:51 Uhr
Wie umschließe ich die start()-Methode meiner Thread-Klasse, damit sie meine self.pid jedes Mal mit ihrer PID füllen kann, wenn ich den Thread starte? Versuchte os.kill(pid) innerhalb des eigenen Threads, es stoppt nur alle Threads einschließlich des Hauptthreads, muss extern vom Elternteil durchgeführt werden, aber wie bekomme ich diese untergeordnete PID vom Elternteil?
– Rodrigo Formighieri
27. Februar 2019 um 12:41 Uhr
Wie andere angedeutet haben, funktioniert dies leider nicht auf so etwas wie einem eingebetteten Linux, das auf einem 32-Bit-Arm läuft.
– Travis Griggs
23. September 2019 um 23:48 Uhr
@TravisGriggs Das Konzept ist auf Linux portierbar, einschließlich 32-Bit-ARM-Plattformen. Sie müssen nur die richtige Systemrufnummer erhalten, die wahrscheinlich 224 auf ARM und ARM64 sein wird. Es könnte mit einem kleinen C-Programm zur Build- oder Laufzeit bestimmt werden. Dies funktioniert bei mir mit Python 3.7 auf einem RPi. Die Antwort von Jake Tesler ist besser, wenn Sie Python 3.8 haben, das in Raspbian 10 noch nicht vorhanden ist.
– TrientP
3. Dezember 2019 um 22:19 Uhr
Jake Teslar
Diese Funktionalität wird jetzt von Python 3.8+ unterstützt 🙂
Sie können jetzt verwenden: threading.get_native_id()
Sie können die ID des aktuell ausgeführten Threads abrufen. Die Ident könnte für andere Threads wiederverwendet werden, wenn der aktuelle Thread endet.
Wenn Sie eine Instanz von Thread erstellen, wird dem Thread implizit ein Name gegeben, der dem Muster entspricht: Thread-Nummer
Der Name hat keine Bedeutung und der Name muss nicht eindeutig sein. Die Ident aller laufenden Threads ist eindeutig.
...
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.
Peter Mortensen
Ich habe mehrere Threads in Python erstellt, ich habe die Thread-Objekte gedruckt und ich habe die ID mit dem gedruckt ident Variable. Ich sehe, dass alle IDs gleich sind:
<Thread(Thread-1, stopped 140500807628544)>
<Thread(Thread-2, started 140500807628544)>
<Thread(Thread-3, started 140500807628544)>