我意识到"快"有点主观所以我会用一些背景来解释.我正在研究一个名为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库,旨在避免第三方lib依赖项,如pywin32扩展.我需要一个比我们当前代码更快的解决方案,它不依赖于pywin32或标准Python发行版中没有的其他模块.
编辑:澄清 - 我们很清楚,阅读过程中存在固有的竞争条件.如果在数据收集过程中进程消失或者遇到其他问题,我们会引发异常.pid_exists()函数无意替换正确的错误处理.
更新:显然我早期的基准测试存在缺陷 - 我用C语言编写了一些简单的测试应用程序,EnumProcesses的编写速度一直较慢,OpenProcess(与PID有效但过程已经停止时一起使用GetProcessExitCode)实际上要快得多而且速度慢.
在POSIX系统中,我想查看给定的进程(例如PID 4356)是否正在运行.如果我能获得有关该过程的元数据会更好.
我想获取Mac上正在运行的进程列表,类似于你从'ps -ea'获得的进程
我曾尝试 os.popen("PS -ea"),但这只是列出的过程,想必那些由所属的外壳拥有的一小部分.
我尝试过的其他选择是
'sh -c /bin/ps -ea'
'bash -c /bin/ps -ea'
'csh -c /bin/ps -ea'
Running as root via sudo
data = subprocess.Popen(['ps','ea'], stdout=subprocess.PIPE).stdout.readlines()
Run Code Online (Sandbox Code Playgroud)
还有哪些方法可以为我提供完整的流程信息列表?
这是一个wx python应用程序,用于监视特定进程并发现它们何时死亡.