【发布时间】:2010-10-10 04:28:33
【问题描述】:
我意识到“快速”有点主观,所以我将结合一些上下文进行解释。我正在开发一个名为 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 有效但进程有停止)实际上是更快而不是更慢。
【问题讨论】: