Ini tambalan untuk mengganti pengidentifikasi utas python dengan TID
seperti yang ditampilkan di 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!")
Berkat posting ini, saya mendapatkan utas Python untuk melaporkan ID utas masing-masing. Pertama lakukan grep -r 'SYS_gettid' /usr/include/'
. Saya mendapat baris:#define SYS_gettid __NR_gettid
Setelah grepping lebih lanjut dengan grep -r '__NR_gettid' /usr/include/
, saya mendapat banyak baris yang cocok:
/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
Sekarang pilih salah satu yang cocok dengan arsitektur Anda. Milik saya adalah 186. Sekarang sertakan kode ini di semua skrip utas Python Anda untuk mendapatkan ID utas seperti yang terlihat oleh OS:
import ctypes
tid = ctypes.CDLL('libc.so.6').syscall(186)
Batalkan panggilan sistem dengan ptrace()
kesalahan:'Tidak dapat terhubung ke server MySQL lokal melalui soket '/var/run/mysqld/mysqld.sock' (2)' -- Hilang /var/run/mysqld/mysqld.sock