有效地衡量一个过程持续了多长时间 运行

Efficiently measuring how long a process has been running

我正在尝试计算进程的运行时间(游戏中的跟踪时间)。以下代码有效,但使 CPU 一直处于忙碌状态。 我想这与 while 循环不断轮询以检查进程是否仍在 运行 有关。有没有更有效的实现方法?

def is_running(process_name):
    try:
        subprocess.check_output(['pidof', process_name])
        return True
    except subprocess.CalledProcessError:
        return False


def monitor_process(process_name):
    while True:
        if is_running(process_name):
            start_time = time.time()
            while is_running(process_name):
                pass

            return round(time.time() - start_time, 3)

        else:
            pass

您应该使用 psutil(python 系统和进程实用程序) 搜索 运行 进程。

请注意 pidof 命令仅适用于基于 Linux 的系统, Unix 用户可以尝试 ps 命令或 pgrep 命令来查找 运行 程序的 pid。 Windows.

上不存在此命令
import psutil


def filter_by_name(process_name):
    for process in psutil.process_iter():
        try:
            if process.name() == process_name:
                yield process
        except psutil.NoSuchProcess:
            pass


def is_running(process_name):
    return any(p for p in filter_by_name(process_name))


process_name = "Mail"
if is_running(u"{0}".format(process_name)):
    print(u"{0} is running.".format(process_name))
else:
    print(u"Bad new, {0}'s dead!".format(process_name))

使用无限循环很耗资源 并检查给定进程是否为 运行。真是低效! 至少,使用 time.sleep(sec) 在每次迭代之间做一个小的停顿。

再说一遍,psutil可以帮到你!

如果您使用 psutil.process_iter() 或我们的 filter_by_name() 函数,可以等待进程终止。 只需使用 wait() 方法和 timeout(以秒为单位)。 然后,当该过程完成时, 您可以减去当前时间和 create_time() 以获得处理持续时间(以秒为单位)。

import time

for p in filter_by_name(process_name):
    p.wait(timeout=10)
    print(time.time() - p.create_time())

注意:按名称搜索进程可能会导致重复。