2012-08-16 10 views
8

Estoy comenzando una serie de subprocesos diferentes en mi secuencia de comandos de Python. Quiero hacer un seguimiento de la memoria y el uso de la CPU de cada uno de estos hilos. Yo uso top y ps -eLf para eso.Identificación de un subproceso de Python según lo informado por la parte superior

Pero resulta que el identificador devuelto por thread.start_new_thread() es diferente del thread PID mostrado por top y otros programas similares. ¿Hay alguna forma de obtener este PID en el script de Python? De esta forma, puedo determinar qué PID pertenece a cada hilo.

+1

En lugar de analizar superior, puede leer detenidamente/proc/main_PID/task y obtener una lista de sus hilos secundarios y su uso de memoria. –

+0

@ ers81239 ¡Gracias! Pero, ¿qué debería buscar exactamente aquí? Todos los directorios allí se ven muy similares. Quiero correlacionar qué tid pertenece a qué subproceso, ya que uno de esos subprocesos usa mucha CPU. – Phani

Respuesta

12

Gracias a esto post, obtuve los hilos de Python para reportar sus respectivos ID de hilo. Primero haz un grep -r 'SYS_gettid' /usr/include/'. Tengo una línea: #define SYS_gettid __NR_gettid Tras una posterior grepping por grep -r '__NR_gettid' /usr/include/, tengo un montón de líneas que coincidan con:

/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 elegir la que se adapte a su arquitectura. El mío era 186. Ahora incluyen este código en todas las secuencias de comandos de hilos de Python para obtener el ID del hilo como se ve por el sistema operativo:

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

¿Qué sistema operativo está utilizando?

Con la excepción de versiones muy antiguas de Linux, cada hilo debe tener el mismo PID (ID de proceso). El identificador en thread.start_new_thread() es interno a python y se usa para identificar un hilo de ejecución en particular.

Para obtener más información sobre el enrutamiento de linux, consulte la página man de pthreads en Linux.

+2

Bueno, no es realmente el PID al que me refiero aquí, es el tid que se informa como un 'PID' digamos, 'arriba' al presionar la tecla 'H' para ver todos los hilos. – Phani

+0

Estoy usando Ubuntu 11.10 versión. – Phani

4

Aquí hay un parche para reemplazar el identificador de hilo de pitón 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 
    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!' 
Cuestiones relacionadas