Aquí hay un parche para reemplazar el identificador de hilo de python con el TID
como se muestra en 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!")
Gracias a esta publicación, conseguí que los subprocesos de Python informaran sus respectivos ID de subprocesos. Primero haz un grep -r 'SYS_gettid' /usr/include/'
. Tengo una línea:#define SYS_gettid __NR_gettid
Luego de un mayor grepping por grep -r '__NR_gettid' /usr/include/
, obtuve un montón de líneas coincidentes:
/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
Ahora elija el que coincida con su arquitectura. El mío era 186. Ahora incluya este código en todos sus scripts de subprocesos de Python para obtener el ID del subproceso tal como lo ve el sistema operativo:
import ctypes
tid = ctypes.CDLL('libc.so.6').syscall(186)