The code always returns 0.0 values, regardless of interval values.
import psutil
p = psutil.Process()
print p.cpu_percent(interval=1)
print p.cpu_percent(interval=None)
The code always returns 0.0 values, regardless of interval values.
import psutil
p = psutil.Process()
print p.cpu_percent(interval=1)
print p.cpu_percent(interval=None)
This behaviour is documented:
When interval is
0.0
orNone
compares process times to system CPU times elapsed since last call, returning immediately. That means the first time this is called it will return a meaningless0.0
value which you are supposed to ignore. In this case is recommended for accuracy that this function be called a second time with at least0.1
seconds between calls.
There is also a warning against using interval=None
for a single call:
Warning: the first time this function is called with interval =
0.0
orNone
it will return a meaningless0.0
value which you are supposed to ignore.
If using interval=None
, make sure to call .cpu_percent
compared to a prior call.
p = psutil.Process(pid=pid)
p.cpu_percent(interval=None)
for i in range(100):
usage = p.cpu_percent(interval=None)
# do other things
instead of:
for i in range(100):
p = psutil.Process(pid=pid)
p.cpu_percent(interval=None)
# do other things
The cpu of a Process object is mutable. I have done some tests for you.
for i in range(10):
p = psutil.Process(3301)
print p.cpu_percent(interval=0.1)
result:
9.9 0.0 0.0 0.0 0.0 9.9 0.0 9.9 0.0 0.0
So if you want to get the CPU percent of a Process object, you could take the average in certain time.
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)
result:
1.98
Monitor the current process, i.e., p = psutil.Process()
or p = psutil.Process(os.getpid())
p.cpu_percent()
will always render you 0.0, because it will block your current process. During the blocking period, the cpu percent is actually 0.0;p.cpu_percent()
immediately after p.cpu_percent()
will also return 0.0. The period between that two calls is too short for psutil
to monitor correctly. So make sure at least 0.1 sec elapsed between two calls.Monitor some other process, i.e., p = psutil.Process(other_pid)
cpu_percent()
function too shortly after another, reason the same as above.Another Note:
p = psutil.Process()
should be called just once and reuse p
afterwards, rather than call it every time before you call p.cpu_percent()
; otherwise you are actually calling cpu_percent()
function the first time whenever you call p.cpu_percent()
, with unexpected return value 0.0.
From my own code that works:
cpu = psutil.cpu_times_percent(interval=0.4, percpu=False)
© 2022 - 2024 — McMap. All rights reserved.
psutil
. (I've used other versions of the library and it always worked fine). Note that I could obtain non-zero values starting different threads in the current process. – Iconodulypsutil.cpu_percent(interval=1)
like documented at code.google.com/p/psutil/wiki/Documentation#CPU? And I think when using the Process class you have to specify a PID (likep = psutil.Process(os.getpid())
). – Dharma