Voici un patch pour remplacer l'identifiant de thread python par le TID
comme affiché dans 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!")
Grâce à ce post, j'ai demandé aux threads Python de signaler leurs ID de thread respectifs. Faites d'abord un grep -r 'SYS_gettid' /usr/include/'
. J'ai une ligne :#define SYS_gettid __NR_gettid
Après un nouveau gripping par grep -r '__NR_gettid' /usr/include/
, j'ai un tas de lignes correspondantes :
/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
Choisissez maintenant celui qui correspond à votre architecture. Le mien était de 186. Incluez maintenant ce code dans tous vos scripts de thread Python pour obtenir l'ID de thread tel qu'il est vu par le système d'exploitation :
import ctypes
tid = ctypes.CDLL('libc.so.6').syscall(186)