python-3.x - 如何构建流程树?
问题描述
我有一个进程列表。
我想把这个进程列表组织成一个树形结构,这样我就可以轻松地可视化父子关系,并识别可疑或不需要的进程。
但是,我正在努力想出一种算法或伪代码来创建流程树。
我不能使用像 pstree 这样的工具,因为我正在处理文本进程日志。
你能指出任何可以应用于这个问题的数据结构或算法吗?
下面是一些示例代码来说明问题:
class Process():
def __init__(self, name, pid, parent_pid):
self.name = name
self.pid = pid
self.ppid = parent_pid
# assume you have a process list with these fields:
# process name, PID, Parent PID
proc1 = Process("one", 1, 0)
proc2 = Process("two", 2, 1)
proc3 = Process("three", 3, 2)
proc4 = Process("four", 4, 3)
proc5 = Process("five", 5, 3)
proc6 = Process("six", 6, 2)
# append each process to a list
process_list = [proc1, proc2, proc3, proc4, proc5, proc6]
for each_proc in process_list:
# how do I do this?
get_child_processes()
display_as_tree()
"""
Desired output:
one
|
|__two
|
|__three
| |
| |_four
| |
| |_five
|
|__six
"""
解决方案
在解决了这个问题之后,我通过深度优先搜索算法找到了解决方案。
这是带有输出的代码的简化示例:
# Make a dictionary consisting of parent processes child nodes
# This is basically an adjacency graph
graph = {
'proc1' : ['proc2','proc3'],
'proc2' : ['proc4', 'proc5'],
'proc3' : ['proc7'],
'proc4' : [],
'proc5' : ['proc6'],
'proc6' : [],
'proc7' : []
}
# Set to keep track of visited nodes.
visited = set()
# Use the depth first search algorithm to construct the process tree
def depth_first_search(visited, graph, node, padding):
if node not in visited:
display = padding + node
print (display.strip())
padding += "..."
visited.add(node)
for neighbour in graph[node]:
depth_first_search(visited, graph, neighbour, padding)
# Execute depth first search function
padding = "".strip()
depth_first_search(visited, graph, 'proc1', padding)
输出:
$ python proc_tree.py
proc1
...proc2
......proc4
......proc5
.........proc6
...proc3
......proc7
推荐阅读
- javascript - 如何在前端对列进行分组?
- c# - 多次重复 linq 查询
- spring-integration - Spring Cloud 数据流不流
- swift-package-manager - 使用 SwiftPM 导出公共 C 标头
- reactjs - react-select 没有正确设置 defaultValue 参数
- pdf - 我应该用什么来在gdscript中保存像pdf这样的文本
- r - 循环一个 R 函数
- java - 仅为对 Spring Boot Repository 方法的特定调用禁用日志记录
- javascript - 添加两个独立函数的总和
- r - 使用 ifelse 去除异常值