34

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} 出力

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

5 に答える 5

28

最初に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

注: python3 ユーザーは pyprctl を使用したい場合があります

于 2015-12-18T20:15:40.273 に答える
8

prctlシステムにインストールされている場合、次のモンキー パッチを使用して、python スレッドの名前をシステムに伝達します。

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% 安全であるとは保証できませんが、私には効果があります。

于 2016-02-08T22:24:30.830 に答える