Python psutil进程未运行、重复使用或已死亡或僵死

Python psutil进程未运行、重复使用或已死亡或僵死,python,process,psutil,Python,Process,Psutil,psutil.process\u iter()包括什么?因为它是一个缓存实例,所以它是只包含当时正在运行的进程,还是包含所有内容并将其当前状态留给用户验证?我的代码: for _process in psutil.process_iter(): try: new_proc = _process.as_dict(attrs=['cpu_times', 'name', 'pid', 'status']) except psutil.NoSuchProcess:

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

for _process in psutil.process_iter():
    try:
        new_proc = _process.as_dict(attrs=['cpu_times', 'name', 'pid', 'status'])
    except psutil.NoSuchProcess:
        continue
这里过滤的所有状态是什么?我需要自己验证什么呢?

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

其中“running”由定义,返回僵尸进程的
True
.is\u running()
可以安全使用,即使进程已结束且其pid已被重用

我的理解是,
\u process.is\u running()
psutil.process\u iter()
产生它的那一刻是正确的。原则上,在
\u进程之前。由于dict
返回信息,可能会发生以下几种情况:

  • 进程可能会死亡--成为僵尸:
    \u进程.是否正在运行()
    为真,
    pid
    状态
    有意义
  • 它可能会被收获--死掉:进程信息不可用(
    psutil.NoSuchProcess
    异常)或过时(如果缓存)
  • 它的pid可以重用——一些
    \u进程
    方法可能会错误地返回新进程的信息
    .is\u running()
    使用多个进程属性,因此它应该在重用
    pid
    时检测到这种情况
  • 通常,操作系统不会立即重用
    pid
    ,因此p.3不应该频繁出现。

    psutil.process\u iter()
    迭代系统中所有正在运行的进程
    ZombieProcess
    错误主要出现在MacOS中,解决方法可以是在异常情况下使用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
    

    谢谢你的标签。添加一个标记需要1500个信誉度。这是正确的。
    进程
    类通过其PID绑定到进程。因此,PID可以随时消失或重新使用[1]。这就是为什么每次处理它时,您都应该尝试/除了捕获至少
    NoSuchProcess
    异常(还包括
    ZombieProcess
    )之外。[1] 必须指出的是,除非
    流程
    实例是旧的,否则重复使用PID的风险非常低,或者可能为0。