2015-12-18 14 views
10

Po ustawieniu nazwy wątku Python nie pojawia się na htop lub ps. Wyjście ps wyświetla tylko python jako nazwę wątku. Czy istnieje sposób na ustawienie nazwy wątku, aby pojawiał się w raportach systemowych takich jak one?Nazwa wątku Python nie pojawia się na ps lub htpie

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} wyjście

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

To jest [duplikat] (http://stackoverflow.com/questions/2369738/can-i-set-the-name-a-thread-in-pthreads-linux) Myślę, że –

+0

@ NickCraig- Wood: Nie bardzo, to pytanie nie dotyczy C, dotyczy Pythona. –

+0

@ NickCraig-Wood Dzięki Nick! W tej chwili czytam pthreads. Tak, to pomaga, ale nadal nie odpowiada na moje pytanie, jeśli chodzi o Python (czy coś mi brakuje?) – Chamila

Odpowiedz

14

pierwszej instalacji prctl module. (Na Debianie/Ubuntu wystarczy wpisać 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() 

Drukuje

$ 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

Dzięki @ NickCraig-Wood! Dlaczego Python nie przekazuje od razu podanej nazwy do prctl podczas tworzenia wątków z klasy Thread? – Chamila

+3

Istnieje już problem z pythonem: https://bugs.python.org/issue15500 –

+0

Nie instaluj prctl z 'pip' lub otrzymujesz' AttributeError: 'moduł' object nie ma atrybutu 'get_name''. – BurnsBA

4

używam następującą poprawkę małpa propagować nazwę python gwint do systemu, jeśli prctl jest zainstalowany w systemie:

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 

Po wykonaniu tego kodu, możesz ustawić nazwę wątku jak zwykle:

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

Oznacza to, że jeśli już ustawiłeś nazwy dla wątków, nie musisz niczego zmieniać. Nie mogę zagwarantować, że jest to w 100% bezpieczne, ale działa to dla mnie.

Powiązane problemy