检测进程是否正在运行的最快方法

kn0*_*ulo 1 python performance pid process

我需要我的对象“启动器”来检测其关联的进程是否正在运行。我最初的解决方案是简单地使用 psutil 运行 for 循环

def Launcher(self, processName):
    self.processName=processName

def process_up(self, attempts=0):
        if attempts <= 3:
            try:
                if self.processName in (p.name() for p in psutil.process_iter()):
                    return True
                else:
                    return False
                
            except:
                self.process_up(attempts=1)
        else:
            logging.error("Psutil Fatal Error. Unable to check status of process {}".format(self.processName))
            return False
Run Code Online (Sandbox Code Playgroud)

递归用于极少数情况,即在 for 循环中检测到进程 p 但在调用 .name() 之前死亡。

不管怎样,这一切听起来都很好,直到我用我的所有进程(大约 40 个进程,所以 40 个启动器正在运行)对其进行测试,问题是运行这个循环大约需要 0.1 秒,这意味着总共〜4秒。

但是,我需要瞄准 <1 秒。还有哪些其他超级快速的方法来查找给定进程是否正在运行?我不需要知道有关该进程的任何信息(我不关心它的 pid 或名称),只要它是否启动即可。

附带说明:我不能使用多线程或任何类型的并行性。我必须按顺序运行这些启动器。

编辑:我也尝试了以下代码,这绝对是更好的性能:

def process_up(self):
    try:
        call = subprocess.check_output("pgrep -f '{}'".format(self.processName), shell=True)
        return True
    except subprocess.CalledProcessError:
        return False
Run Code Online (Sandbox Code Playgroud)

现在代码运行时间约为 2 秒,但仍然太多了

小智 5

使用pidof应该比pgrep

def process_up(self):
    try:
        call = subprocess.check_output("pidof '{}'".format(self.processName), shell=True)
        return True
    except subprocess.CalledProcessError:
        return False
Run Code Online (Sandbox Code Playgroud)