2

psutil.process_iter() 包括什么?因为,它是一个缓存实例,它是否只包含当时正在运行的进程,还是包含所有内容并留下它们的当前状态以供用户验证?我的代码:

for _process in psutil.process_iter():
    try:
        new_proc = _process.as_dict(attrs=['cpu_times', 'name', 'pid', 'status'])
    except psutil.NoSuchProcess:
        continue

什么所有状态都在这里过滤?我必须自己验证什么?

4

2 回答 2

0

文档psutil.process_iter()

返回一个迭代器,为本地机器上所有正在运行的进程生成一个 Process 类实例。每个实例只创建一次,然后缓存到一个内部表中,每次产生一个元素时都会更新该表。 强调是我的

其中“运行”由为僵尸进程返回的.is_running()方法定义。即使进程消失并且其 pid 被重用,也可以安全使用。True.is_running()

我的理解是,_process.is_running()目前确实如此psutil.process_iter()。原则上,在_process.as_dict返回信息之前,可能会发生几件事:

  1. 进程可能死亡——变成僵尸:_process.is_running()是真实的,pid并且status是有意义的
  2. 它可能会被收割——死死:进程信息不可用(psutil.NoSuchProcess异常)或过时(如果缓存)
  3. 它的 pid 可能会被重用——某些_process方法可能会错误地返回进程的信息。.is_running()使用多个流程属性,因此它应该检测pid重用的情况。

通常,操作系统不会pid立即重用,因此 p.3 不应频繁出现。

于 2014-04-01T14:54:45.747 回答
0

psutil.process_iter()遍历系统中所有正在运行的进程。ZombieProcess错误主要在 MacOS 中观察到,解决方法可能是在异常中处理它except psutil.ZombieProcess:

for _process in psutil.process_iter():
    try:
        new_proc = _process.as_dict(attrs=['cpu_times', 'name', 'pid', 'status'])
    except psutil.NoSuchProcess:
        continue
    except psutil.ZombieProcess:
        continue
于 2018-08-23T16:19:25.920 回答