diff options
author | Nico Schlömer <nico.schloemer@gmail.com> | 2022-03-08 10:01:12 +0100 |
---|---|---|
committer | Nico Schlömer <nico.schloemer@gmail.com> | 2022-03-08 10:01:12 +0100 |
commit | 9a99ff6bdcc1eb5d95571ed60a94966bda4017f1 (patch) | |
tree | 99812defac1f07d3e587bd375250ee09cf0ff00d | |
parent | 27e963b2a9cdf2059aab65d4adbce046d5c9e05d (diff) |
better get_procs_list
-rw-r--r-- | src/tiptop/_procs_list.py | 90 |
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, |