cpu_percent(interval=None) 无论间隔值如何总是返回0 PYTHON
这段代码无论输入什么区间值,最后总是返回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())
- 如果你设置的时间间隔大于0,调用
p.cpu_percent()
会一直返回0.0,因为这会阻塞你当前的进程。在这个阻塞期间,CPU的使用率实际上是0.0; - 如果时间间隔是0.0或者None,紧接着调用另一个
p.cpu_percent()
也会返回0.0。因为这两次调用之间的时间太短,psutil
来不及正确监控。所以确保两次调用之间至少间隔0.1秒。
- 如果你设置的时间间隔大于0,调用
监控其他进程,也就是用
p = psutil.Process(other_pid)
- 如果时间间隔大于0,可能会得到你想要的结果;
- 如果时间间隔是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