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)