Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 每个线程的CPU使用率_Python_Multithreading - Fatal编程技术网

Python 每个线程的CPU使用率

Python 每个线程的CPU使用率,python,multithreading,Python,Multithreading,我需要为每个进程线程获取CPU% 因此,我创建了一个简单的脚本: import psutil from psutil import Process p = psutil.Process(4499) treads_list = p.get_threads() for i in treads_list: o = i[0] th = psutil.Process(o) cpu_perc = th.get_cpu_percent(interval=1) print('

我需要为每个进程线程获取CPU%

因此,我创建了一个简单的脚本:

import psutil
from psutil import Process
p = psutil.Process(4499)

treads_list = p.get_threads()

for i in treads_list:
    o = i[0]
    th = psutil.Process(o)
    cpu_perc = th.get_cpu_percent(interval=1)
    print('PID %s use %% CPU = %s' % (o, cpu_perc))
以下是TOP在此过程中的外观:

 4942 teamcity  20   0 3288m 831m 3124 R 33.3 10.6  10303:37 java
32700 teamcity  20   0 3288m 831m 3124 S  5.9 10.6  18:49.99 java
 5824 teamcity  20   0 3288m 831m 3124 S  5.9 10.6   1:57.90 java
 4621 teamcity  20   0 3288m 831m 3124 S  3.0 10.6   1834:09 java
 4622 teamcity  20   0 3288m 831m 3124 S  2.6 10.6   1844:15 java
线程使用2.6-5.9%的CPU,父PID使用33.3%

但是-下面是脚本的结果:

# ./psutil_threads.py
PID 10231 use % CPU = 60.9
PID 10681 use % CPU = 75.3
PID 11371 use % CPU = 69.9
PID 11860 use % CPU = 85.9
PID 12977 use % CPU = 56.0
PID 14114 use % CPU = 88.8
看起来每个线程“吃掉”了56-88%的CPU

我错过了什么

获取cpu百分比(间隔=0.1)

返回表示进程CPU利用率百分比的浮点值

当间隔>0.0时,将进程时间与间隔前后经过的系统CPU时间进行比较(阻塞)

当interval为0.0或None时,将进程时间与自上次调用以来经过的系统CPU时间进行比较,并立即返回。在这种情况下,建议在调用之间至少间隔0.1秒调用此函数,以确保准确性

这听起来很像它会告诉您返回了多少非空闲CPU时间(即:每个系统CPU时间的进程CPU时间量),而top则显示了与实际时间相关的进程CPU时间量。考虑到你的数字,这似乎是现实的


要获得top所显示的值,只需将每个线程的CPU使用率乘以线程运行时应该工作的核心的CPU使用率<代码>psutil.cpu_百分比应该有帮助。请注意,在乘以百分比之前,您需要将百分比除以100.0(以获得0和1之间的“百分比”)。

这将为您提供所需内容并匹配top(根据您的用例):


虽然Gabe的答案很好,但请注意,较新的psutil版本需要以下更新的语法:

import psutil

def get_threads_cpu_percent(p, interval=0.1):
   total_percent = p.cpu_percent(interval)
   total_time = sum(p.cpu_times())
   return [total_percent * ((t.system_time + t.user_time)/total_time) for t in p.threads()]

# Example usage for process with process id 8008:
proc = psutil.Process(8008)
print(get_threads_cpu_percent(proc))

我对Florent Thiery和Gabe解决方案进行了改进,创建了一个小脚本,可以用来监视任何进程的CPU使用情况(通过线程)

python cpuusage.py


计算机有多少内核?此外,脚本结果中显示的PID与
top
中的PID不匹配。是否显示不同运行的日志?是否使用多核计算机?工具有不同的方法来表示多核架构的CPU%;有些人认为100%是满负荷的整个系统,而另一些则是满100%的一个核心,所以可以使用100%以上的进程或线程(参见).@ DANO 4内核;大约有130个线程,因此-我没有将它们全部发布,但我选中了:
#ls-l/proc/4499/task/| grep 10231 dr-xr-xr-x 5 teamcity teamcity 0 Oct 7 16:54 10231
-4499 PID(父PID)的线程10231显示的进程不是threadsEven,间隔为0(e.q.
cpu perc=th.get\cpu百分比()
)我得到了:
。/psutil\u threads.py PID 10231 use%CPU=42.1 PID 10681 use%CPU=29.3 PID 11371 use%CPU=60.0 PID 11860 use%CPU=41.0 PID 12977 use%CPU=40.0
我可能选择了错误的高亮显示,但它说的是关于相互比较时间的完全相同的事情,间隔的RegarClass==0.0或间隔>0.0。当interval为0.0或None时,将进程时间与自上次调用以来经过的系统CPU时间进行比较,并立即返回
import psutil

def get_threads_cpu_percent(p, interval=0.1):
   total_percent = p.cpu_percent(interval)
   total_time = sum(p.cpu_times())
   return [total_percent * ((t.system_time + t.user_time)/total_time) for t in p.threads()]

# Example usage for process with process id 8008:
proc = psutil.Process(8008)
print(get_threads_cpu_percent(proc))
import psutil, sys, time, os

def clear():
    if os.name == "nt":
        _ = os.system("cls")
    else:
        _ = os.system("clear")

def get_threads_cpu_percent(p, interval=0.1):
   total_percent = p.cpu_percent(interval)
   total_time = sum(p.cpu_times())
   return [('%s %s %s' % (total_percent * ((t.system_time + t.user_time)/total_time), t.id, psutil.Process(t.id).name())) for t in p.threads()]

try:
    sys.argv[1]
except:
    sys.exit('Enter PID')

proc = psutil.Process(int(sys.argv[1]))

while True:
    clear()
    threads = get_threads_cpu_percent(proc)
    threads.sort(reverse=True)
    for line in threads:
       print(line)
    time.sleep(1)