【问题标题】:cpu_percent(interval=None) always returns 0 regardless of interval value PYTHONcpu_percent(interval=None) 总是返回 0 而不管间隔值 PYTHON
【发布时间】:2014-06-23 13:37:46
【问题描述】:

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

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

【问题讨论】:

  • 嗯,我可以重现它。这可能是psutil 较新版本中的错误。 (我使用过其他版本的库,它总是运行良好)。请注意,在当前进程中启动不同线程时,我可以获得非零值。
  • 您是否尝试过使用psutil.cpu_percent(interval=1),如code.google.com/p/psutil/wiki/Documentation#CPU 中记录的那样?而且我认为在使用 Process 类时,您必须指定一个 PID(例如 p = psutil.Process(os.getpid()))。
  • @ChristianBerendt:我从同一个链接阅读了文档并指定了几个 PID(有效且正在运行),但我总是得到 0.0
  • >>> 导入 psutil>>> p = psutil.Process() >>> p.cpu_percent(interval=1) 0.0 >>> p.cpu_percent(interval=None) 0.0 >>>

标签: python psutil


【解决方案1】:

这种行为是documented:

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

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

警告:第一次使用 interval = 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

【讨论】:

  • 它仍然返回 0.0
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    • 监控当前进程,即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() 之后立即调用另一个 p.cpu_percent() 也将返回 0.0。两次调用之间的时间间隔太短,psutil 无法正确监控。所以确保两次通话之间至少间隔 0.1 秒
    • 监控其他进程,即p = psutil.Process(other_pid)

      1. 大于 0 的区间值可能会得到预期值;
      2. interval值为0.0或者None,还是不要太快调用cpu_percent()函数,原因同上。

    另一个注意事项:

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

    【讨论】:

      【解决方案4】:

      来自我自己的有效代码:

      cpu = psutil.cpu_times_percent(interval=0.4, percpu=False)
      

      【讨论】:

      • 但是我需要找到 Process 对象的 CPU 百分比
      猜你喜欢
      • 1970-01-01
      • 2015-07-03
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 2019-05-08
      相关资源
      最近更新 更多