GNU/Linux >> Linux の 問題 >  >> Linux

top によって報告された Python スレッドの ID

これは、python スレッド識別子を TID に置き換えるパッチです。 htop に表示されているように :

def patch_thread_identifier():
    """Replace python thread identifier by TID."""
    # Imports
    import threading, ctypes
    # Define get tid function
    def gettid():
        """Get TID as displayed by htop."""
        libc = 'libc.so.6'
        for cmd in (186, 224, 178):
            tid = ctypes.CDLL(libc).syscall(cmd)
            if tid != -1:
                return tid
    # Get current thread
    current = threading.current_thread()
    # Patch get_ident (or _get_ident in python 2)
    threading.get_ident = threading._get_ident = gettid
    # Update active dictionary
    threading._active[gettid()] = threading._active.pop(current.ident)
    # Set new identifier for the current thread
    current._set_ident()
    # Done
    print("threading._get_ident patched!")

この投稿のおかげで、Python スレッドがそれぞれのスレッド ID を報告するようになりました。最初に grep -r 'SYS_gettid' /usr/include/' を実行します .次の行を取得しました:#define SYS_gettid __NR_gettid grep -r '__NR_gettid' /usr/include/ でさらに grep すると 、一致する行がたくさんあります:

/usr/include/x86_64-linux-gnu/asm/unistd_32.h:#define __NR_gettid 224
/usr/include/x86_64-linux-gnu/asm/unistd_64.h:#define __NR_gettid 186
/usr/include/asm-generic/unistd.h:#define __NR_gettid 178

次に、アーキテクチャに一致するものを選択します。私の場合は 186 でした。すべての Python スレッド スクリプトに次のコードを含めて、OS から見たスレッド ID を取得します。

import ctypes
tid = ctypes.CDLL('libc.so.6').syscall(186)

Linux
  1. Python2コードをPython3に変換する

  2. Python 3.3.2のインストール?

  3. 方法:Pythonでのソケットプログラミング

  1. トップ10のDSPプロバイダー

  2. スレッド ID とスレッド ハンドル

  3. Ctrl-C で Python スクリプトを強制終了できません

  1. LinuxにPythonをインストールする方法

  2. Linuxの使用トップ20

  3. Linux で top によって報告される CPU 使用率が 100% を超えるのはなぜですか?