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