15

无论区间值如何,代码始终返回 0.0 值。

import psutil
p = psutil.Process()
print p.cpu_percent(interval=1)
print p.cpu_percent(interval=None)
4

4 回答 4

8

这种行为记录在案

当interval 是0.0None将处理时间与自上次调用以来经过的系统CPU 时间进行比较时,立即返回。这意味着第一次调用它时,它会返回一个0.0你应该忽略的无意义的值。在这种情况下,为了准确起见,建议第二次调用此函数,两次调用之间至少0.1间隔几秒钟。

还有一个警告不要使用interval=None单个调用:

警告:第一次使用间隔=调用此函数时0.0None它将返回一个0.0您应该忽略的无意义值。

如果使用interval=None,请确保调用.cpu_percent与先前调用相比。

p = psutil.Process(pid=pid)
p.cpu_percent(interval=None)
for i in range(100):
    usage = p.cpu_percent(interval=None)
    # do other things

代替:

for i in range(100):
    p = psutil.Process(pid=pid)
    p.cpu_percent(interval=None)
    # do other things
于 2014-12-01T13:57:43.310 回答
5

Process 对象的 cpu 是可变的。我已经为你做了一些测试。

for i in range(10):
    p = psutil.Process(3301)
    print p.cpu_percent(interval=0.1)

结果: 9.9 0.0 0.0 0.0 0.0 9.9 0.0 9.9 0.0 0.0

因此,如果您想获取 Process 对象的 CPU 百分比,您可以在特定时间取平均值。

test_list = []
for i in range(10):
    p = psutil.Process(6601)
    p_cpu = p.cpu_percent(interval=0.1)
    test_list.append(p_cpu)
print float(sum(test_list))/len(test_list)

结果: 1.98

图片中的更多信息

于 2016-09-30T08:53:58.583 回答
3
  • 监控当前进程,即,p = psutil.Process()p = psutil.Process(os.getpid())

    1. 间隔值大于 0,p.cpu_percent()将始终为您呈现 0.0,因为它会阻止您当前的进程。在阻塞期间,cpu百分比实际上是0.0;
    2. 间隔值为 0.0 或无,p.cpu_percent()之后立即调用另一个p.cpu_percent()也将返回 0.0。两次通话之间的时间太短,psutil无法正确监控。因此,请确保两次通话之间至少间隔 0.1 秒
  • 监控其他进程,即p = psutil.Process(other_pid)

    1. 大于 0 的区间值可能会为您提供预期值;
    2. 间隔值是 0.0 或 None,你仍然不应该cpu_percent()太快调用函数,原因同上。

另一个注意事项:

p = psutil.Process()应该只调用一次并在p之后重用,而不是每次调用之前都调用它p.cpu_percent();否则,您实际上是cpu_percent()在第一次调用时调用函数p.cpu_percent(),意外返回值 0.0。

于 2020-10-31T03:41:52.953 回答
2

从我自己的有效代码中:

cpu = psutil.cpu_times_percent(interval=0.4, percpu=False)
于 2014-06-23T16:07:58.200 回答