summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNico Schlömer <nico.schloemer@gmail.com>2022-03-08 10:53:00 +0100
committerGitHub <noreply@github.com>2022-03-08 10:53:00 +0100
commit1885971adab0b5c85298ec16a958b41f5834852d (patch)
tree99812defac1f07d3e587bd375250ee09cf0ff00d
parent27e963b2a9cdf2059aab65d4adbce046d5c9e05d (diff)
parent9a99ff6bdcc1eb5d95571ed60a94966bda4017f1 (diff)
Merge pull request #77 from nschloe/procs-list
better get_procs_list
-rw-r--r--src/tiptop/_procs_list.py90
1 files changed, 49 insertions, 41 deletions
diff --git a/src/tiptop/_procs_list.py b/src/tiptop/_procs_list.py
index 8c69052..fbceda6 100644
--- a/src/tiptop/_procs_list.py
+++ b/src/tiptop/_procs_list.py
@@ -8,6 +8,43 @@ from textual.widget import Widget
from ._helpers import sizeof_fmt
+def get_process_list(num_procs: int):
+ processes = list(
+ psutil.process_iter(
+ [
+ "pid",
+ "name",
+ "username",
+ "cmdline",
+ "cpu_percent",
+ "num_threads",
+ "memory_info",
+ "status",
+ ]
+ )
+ )
+
+ if processes[0].pid == 0:
+ # Remove process with PID 0. On Windows, that's SYSTEM IDLE, and we
+ # don't want that to appear at the top of the list.
+ # <https://twitter.com/andre_roberge/status/1488885893716975622/photo/1>
+ processes = processes[1:]
+
+ processes = [p.info for p in processes]
+
+ processes = sorted(
+ processes,
+ # The item.info["cpu_percent"] can be `ad_value` (default None).
+ # It gets assigned to a dict key in case AccessDenied or
+ # ZombieProcess exception is raised when retrieving that particular
+ # process information.
+ key=lambda p: (p["cpu_percent"] or 0.0),
+ reverse=True,
+ )
+ processes = processes[:num_procs]
+ return processes
+
+
class ProcsList(Widget):
def on_mount(self):
self.max_num_procs = 100
@@ -15,36 +52,7 @@ class ProcsList(Widget):
self.set_interval(6.0, self.collect_data)
def collect_data(self):
- processes = list(
- psutil.process_iter(
- [
- "pid",
- "name",
- "username",
- "cmdline",
- "cpu_percent",
- "num_threads",
- "memory_info",
- "status",
- ]
- )
- )
-
- if processes[0].pid == 0:
- # Remove process with PID 0. On Windows, that's SYSTEM IDLE, and we
- # don't want that to appear at the top of the list.
- # <https://twitter.com/andre_roberge/status/1488885893716975622/photo/1>
- processes = processes[1:]
-
- processes = sorted(
- processes,
- # The item.info["cpu_percent"] can be `ad_value` (default None).
- # It gets assigned to a dict key in case AccessDenied or
- # ZombieProcess exception is raised when retrieving that particular
- # process information.
- key=lambda item: (item.info["cpu_percent"] or 0.0),
- reverse=True,
- )
+ processes = get_process_list(self.max_num_procs)
table = Table(
show_header=True,
@@ -74,38 +82,38 @@ class ProcsList(Widget):
justify="right",
)
- for p in processes[: self.max_num_procs]:
+ for p in processes:
# Everything can be None here, see comment above
- pid = p.info["pid"]
+ pid = p["pid"]
pid = "" if pid is None else str(pid)
#
- name = p.info["name"]
+ name = p["name"]
if name is None:
name = ""
#
- cmdline = p.info["cmdline"]
- cmdline = "" if cmdline is None else " ".join(p.info["cmdline"][1:])
+ cmdline = p["cmdline"]
+ cmdline = "" if cmdline is None else " ".join(p["cmdline"][1:])
#
- num_threads = p.info["num_threads"]
+ num_threads = p["num_threads"]
num_threads = "" if num_threads is None else str(num_threads)
#
- username = p.info["username"]
+ username = p["username"]
if username is None:
username = ""
#
- mem_info = p.info["memory_info"]
+ mem_info = p["memory_info"]
mem_info = (
"" if mem_info is None else sizeof_fmt(mem_info.rss, suffix="", sep="")
)
#
- cpu_percent = p.info["cpu_percent"]
+ cpu_percent = p["cpu_percent"]
cpu_percent = "" if cpu_percent is None else f"{cpu_percent:.1f}"
table.add_row(
pid, name, cmdline, num_threads, username, mem_info, cpu_percent
)
- total_num_threads = sum((p.info["num_threads"] or 0) for p in processes)
- num_sleep = sum(p.info["status"] == "sleeping" for p in processes)
+ total_num_threads = sum((p["num_threads"] or 0) for p in processes)
+ num_sleep = sum(p["status"] == "sleeping" for p in processes)
self.panel = Panel(
table,