'CPU Percentage Scan
I need to scan through all running processes and filter the ones with high usage. I currently have the code bellow but is taking too long to scan through them.
Is there a way that this can be done faster?
for proc in psutil.process_iter():
try:
cpu_usage = proc.cpu_percent(1)
processName = proc.name()
if cpu_usage > 2:
processID = proc.pid
print(processName , cpu_usage , processID)
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
pass ```
Solution 1:[1]
The reason it is taking so long is because proc.cpu_percent(1) is a blocking function that take 1 second every time it is called. According to the docs, the function can be called once with interval None to get a starting point and then again to get an ending point. This means you could call this function on every Process object in the iterator, the wait 1 second and call the function on all of the objects again. To my understanding this should achieve the same affect with only about 1 second of delay.
Edit for clarity:
Here is an example of what I explained above. I just made it quickly so I recommend you clean it up to your use case but it does work.
import psutil, time
def getTime(proc):
try:
cpu_usage = proc.cpu_percent(interval=None)
processName = proc.name()
if cpu_usage > 2:
processID = proc.pid
print(processName, cpu_usage, processID)
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
pass
for proc in psutil.process_iter():
getTime(proc)
time.sleep(1)
for proc in psutil.process_iter():
getTime(proc)
It runs the getTime function for every process initially, and as the docs state the first time the proc.cpu_percent function is called on a process with interval=None it will return 0.0 as a meaningless number because the function must get a starting point for its measurement. After this it waits 1 second and then runs getTime on every function again. This time however, it returns meaningful results because it has had 1 second per process to measure their usage. Essentially the function needs to be run twice for each but doing it like this can skip a massive amount of time compared to how you were doing it originally.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
