これは、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)
ptrace() でシステム コールをキャンセルする
エラー:「ソケット '/var/run/mysqld/mysqld.sock' (2) を介してローカル MySQL サーバーに接続できません」 -- /var/run/mysqld/mysqld.sock がありません