2015-12-18 3 views
10

Wenn ich den Namen für einen Python-Thread festlegen, wird es nicht auf HTOP oder PS angezeigt. Die ps-Ausgabe zeigt nur python als Thread-Name. Gibt es eine Möglichkeit, einen Thread-Namen so festzulegen, dass er in Systemberichten wie diesen angezeigt wird?Python-Thread-Name wird nicht auf ps oder htop angezeigt

from threading import Thread 
import time 


def sleeper(): 
    while True: 
     time.sleep(10) 
     print "sleeping" 

t = Thread(target=sleeper, name="Sleeper01") 
t.start() 
t.join() 

ps -T p {PID} Ausgabe

PID SPID TTY   TIME CMD 
31420 31420 pts/30 00:00:00 python 
31420 31421 pts/30 00:00:00 python 
+0

Dies ist ein [duplizieren] (http://stackoverflow.com/questions/2369738/can-i-set-the-name-of-a-thread-in-pthreads-linux) Ich denke –

+0

@ NickCraig- Wood: Nicht wirklich, diese Frage handelt nicht von C, es geht um Python. –

+0

@ NickCraig-Wood Danke Nick! Ich lese gerade auf Pthreads. Ja, das hilft, aber es beantwortet meine Frage immer noch nicht, wenn es um Python geht (oder fehle ich etwas?) – Chamila

Antwort

14

zuerst die prctl module installieren. (Auf Debian/Ubuntu geben Sie einfach sudo apt-get install python-prctl)

from threading import Thread 
import time 
import prctl 

def sleeper(): 
    prctl.set_name("sleeping tiger") 
    while True: 
     time.sleep(10) 
     print "sleeping" 

t = Thread(target=sleeper, name="Sleeper01") 
t.start() 
t.join() 

Dieser druckt

$ ps -T 
    PID SPID TTY   TIME CMD 
22684 22684 pts/29 00:00:00 bash 
23302 23302 pts/29 00:00:00 python 
23302 23303 pts/29 00:00:00 sleeping tiger 
23304 23304 pts/29 00:00:00 ps 
+0

Danke @ NickCraig-Wood! Warum übergibt Python beim Erstellen von Threads aus der Thread-Klasse nicht sofort den angegebenen Namen an prctl? – Chamila

+3

Es gibt bereits ein Python-Problem: https://bugs.python.org/issue15500 –

+0

Installieren Sie nicht prctl mit 'pip' oder Sie erhalten' AttributeError: 'Modul' Objekt hat kein Attribut 'get_name''. – BurnsBA

4

ich folgende Affe Patch verwenden Python Thema Namen auf das System zu propagieren, wenn prctl im System installiert ist:

try: 
    import prctl 
    def set_thread_name(name): prctl.set_name(name) 

    def _thread_name_hack(self): 
     set_thread_name(self.name) 
     threading.Thread.__bootstrap_original__(self) 

    threading.Thread.__bootstrap_original__ = threading.Thread._Thread__bootstrap 
    threading.Thread._Thread__bootstrap = _thread_name_hack 
except ImportError: 
    log('WARN: prctl module is not installed. You will not be able to see thread names') 
    def set_thread_name(name): pass 

Nach der Ausführung dieses Codes können Sie den Namen des Threads wie gewohnt festlegen:

threading.Thread(target=some_target, name='Change monitor', ...) 

Das bedeutet, dass wenn Sie bereits Namen für Threads festlegen, Sie nichts ändern müssen. Ich kann nicht garantieren, dass dies 100% sicher ist, aber es funktioniert für mich.

Verwandte Themen