Ich habe ein Multithreading-Python-Programm und eine Dienstprogrammfunktion, writeLog(message)
die einen Zeitstempel gefolgt von der Nachricht schreibt. Leider gibt die resultierende Protokolldatei keinen Hinweis darauf, welcher Thread welche Nachricht generiert.
Ich möchte writeLog()
in der Lage 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 dazu os.getpid()
, das ich verwenden könnte?
python
multithreading
python-multithreading
python-logging
Charles Anderson
quelle
quelle
threading.currentThread()
(camelCase, nicht camel_case) ab Version 2.5.threading.current_thread().ident
auftritt, der unangemessen istNone
. Wahrscheinlich macht es Sinn, nurthread.get_ident()
in Python 2 undthreading.current_thread().ident
in Python 3 zu verwenden.thread.get_ident()
(threading.get_ident()
wurde in Python 3.3 hinzugefügt - folgen Sie den Links zur Dokumentation).Mit dem Protokollierungsmodul können Sie automatisch die aktuelle Thread-ID in jeden Protokolleintrag einfügen. Verwenden Sie einfach einen dieser LogRecord- Zuordnungsschlüssel in Ihrer Zeichenfolge im Logger-Format:
und richten Sie Ihren Standard-Handler damit ein:
quelle
<concurrent.futures.thread.ThreadPoolExecutor object at 0x7f00f882a438>_2
das als Threadnamen. Ist das zwei ist meine Thread-Nummer, die aufgerufen hatDie
thread.get_ident()
Funktion gibt unter Linux eine lange Ganzzahl zurück. Es ist nicht wirklich eine Thread-ID.Ich benutze diese Methode , um die Thread-ID unter Linux wirklich zu erhalten:
quelle
Diese Funktionalität wird jetzt von Python 3.8+ unterstützt :)
https://github.com/python/cpython/commit/4959c33d2555b89b494c678d99be81a65ee864b0
https://github.com/python/cpython/pull/11993
quelle
Ich habe Beispiele für Thread-IDs wie diese gesehen:
Das Dokument des Threading-Moduls listet auch das
name
Attribut auf:quelle
Sie können die Identität des aktuell laufenden Threads abrufen. Die ID 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 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.
Die Funktion threading.current_thread () gibt den aktuell laufenden Thread zurück. Dieses Objekt enthält die gesamten Informationen des Threads.
quelle
Ich habe in Python mehrere Threads erstellt, die Thread-Objekte gedruckt und die ID mithilfe der
ident
Variablen gedruckt . Ich sehe, dass alle IDs gleich sind:quelle
ident
:Thread identifiers may be recycled when a thread exits and another thread is created.
docs.python.org/2/library/threading.html#threading.Thread.identÄhnlich wie bei @brucexin musste ich eine Thread-ID auf Betriebssystemebene (welche! =
thread.get_ident()
) Abrufen und Folgendes verwenden, um nicht von bestimmten Zahlen abhängig zu sein und nur amd64 zu sein:und
Dies hängt jedoch von Cython ab.
quelle
invalid syntax
Zeiger nachextern
Schlüsselwort. Fehlt mir etwas? Ist es wichtig, dass sich der Code in einem separaten Modul befindet und die pyx-Erweiterung hat? Oder ist das eine (Neu-) Kompilierungssache?.pyx
Datei befinden. Für "pure python" könnte wahrscheinlich etwas Ähnliches auch mit ctypes gemacht werden.