我意识到“快速”有点主观,所以我会用一些上下文来解释。我正在开发一个名为psutil的 Python 模块,用于以跨平台方式读取进程信息。其中一个函数是pid_exists(pid)
用于确定PID是否在当前进程列表中的函数。
现在我正在以明显的方式执行此操作,使用EnumProcesses()拉取进程列表,然后遍历列表并查找 PID。但是,一些简单的基准测试表明,这比基于 UNIX 的平台(Linux、OS X、FreeBSD)上的 pid_exists 函数要慢得多,我们使用kill(pid, 0)
0 信号来确定 PID 是否存在。额外的测试表明,几乎所有时间都在占用 EnumProcesses。
任何人都知道比使用 EnumProcesses 确定 PID 是否存在更快的方法吗?我尝试了OpenProcess()并检查打开不存在的进程是否有错误,但结果证明这比遍历 EnumProcesses 列表慢 4 倍以上,所以这也是如此。还有其他(更好的)建议吗?
注意:这是一个 Python 库,旨在避免第三方库依赖项,如 pywin32 扩展。我需要一个比我们当前代码更快的解决方案,并且不依赖于 pywin32 或标准 Python 发行版中不存在的其他模块。
编辑:澄清 - 我们很清楚阅读过程信息中存在固有的竞争条件。如果在数据收集过程中流程消失或遇到其他问题,我们会引发异常。pid_exists() 函数并非旨在替换正确的错误处理。
更新:显然我早期的基准测试存在缺陷——我用 C 语言编写了一些简单的测试应用程序,并且 EnumProcesses 始终运行较慢,而 OpenProcess(与 GetProcessExitCode 结合,以防 PID 有效但进程已停止)实际上更快而不是更慢。