Имя потока Python не отображается на ps или htop
Когда я устанавливаю имя для потока Python, он не отображается на htop или ps. Вывод ps показывает только python
как имя потока. Есть ли способ установить имя потока, чтобы он отображался в системных отчетах, подобных им?
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} output
PID SPID TTY TIME CMD
31420 31420 pts/30 00:00:00 python
31420 31421 pts/30 00:00:00 python
Ответы
Ответ 1
Сначала установите модуль prctl. (На debian/ubuntu просто введите 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()
Отпечатает
$ 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
Ответ 2
Я использую следующий патч обезьяны для распространения имени нити python в системе, если в системе установлен prctl
:
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
После выполнения этого кода вы можете установить имя потока как обычно:
threading.Thread(target=some_target, name='Change monitor', ...)
Это означает, что если вы уже установили имена для потоков, вам ничего не нужно менять. Я не могу гарантировать, что это на 100% безопасно, но это работает для меня.