由顶部报告的Python线程的ID

我在Python脚本中启动了一堆不同的线程。 我想跟踪每个线程的内存和CPU使用情况。 我使用topps -eLf

但事实certificate, thread.start_new_thread()返回的标识符与top和其他类似程序显示的线程PID不同。 有没有一种方法可以从Python脚本中获得这个PID? 这样,我可以确定哪个PID属于哪个线程。

感谢这篇文章 ,我得到了Python线程报告各自的线程ID。 首先做一个grep -r 'SYS_gettid' /usr/include/' 。 我得到一行: #define SYS_gettid __NR_gettid通过grep -r '__NR_gettid' /usr/include/进一步grep -r '__NR_gettid' /usr/include/ ,我得到了一堆匹配的行:

 /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 

现在选择一个符合你的架构的。 Mine是186.现在在你所有的Python线程脚本中包含这个代码来获得操作系统所看到的线程ID:

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

这里有一个补丁,用htop显示的TID替换python线程标识符:

 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!' 

您使用什么操作系统?

除了非常旧的版本的Linux,每个线程应该有相同的PID(进程ID)。 thread.start_new_thread()上的标识符是python的内部标识符,用于标识特定的执行线程。

有关Linux线程的更多信息,请参阅Linux上的pthreads手册页。