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?

War es hilfreich?

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.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top