cpu_percent(interval=None) 无论间隔值如何总是返回0 PYTHON

17 投票
4 回答
15520 浏览
提问于 2025-04-18 10:46

这段代码无论输入什么区间值,最后总是返回0.0的结果。

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

4 个回答

2

这是我自己写的代码,它可以正常工作:

cpu = psutil.cpu_times_percent(interval=0.4, percpu=False)
4
  • 监控当前进程,也就是用 p = psutil.Process() 或者 p = psutil.Process(os.getpid())

    1. 如果你设置的时间间隔大于0,调用 p.cpu_percent() 会一直返回0.0,因为这会阻塞你当前的进程。在这个阻塞期间,CPU的使用率实际上是0.0;
    2. 如果时间间隔是0.0或者None,紧接着调用另一个 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() 前都调用它;否则你每次调用 p.cpu_percent() 时,实际上都是第一次调用 cpu_percent(),这会导致返回值意外地是0.0。

5

一个进程对象的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

所以,如果你想知道一个进程对象的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

更多信息在图片中

10

这个行为是有说明的:

当你设置的时间间隔是 0.0 或者 None 时,它会把进程的运行时间和系统的CPU时间进行比较,这个比较是从上一次调用开始算起的,所以会立即返回结果。这意味着第一次调用的时候,它会返回一个没有意义的 0.0 值,你应该忽略这个值。为了更准确,建议你在调用这个函数的时候,第二次调用要间隔至少 0.1 秒。

还有一个警告是关于单次调用时使用 interval=None 的:

警告:第一次调用这个函数时,如果 interval 设置为 0.0 或者 None,它会返回一个没有意义的 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

撰写回答