【问题标题】:Get python subprocess run time获取python子进程运行时间
【发布时间】:2019-09-19 14:31:11
【问题描述】:

我正在使用python同时运行多个子进程。

我想获取每个进程的运行时间。

我正在使用subprocess 模块。

我做了什么: 我创建了两个单独的 for 循环: 第一个用于运行每个进程 第二个等待所有进程结束。

for prcs in batch:
    p = subprocess.Popen([prcs])
    ps.append(p)
for p in ps:
    p.wait()

这段代码可以很好地同时运行进程,但我不知道要添加什么才能分别获取每个进程的运行时间。

编辑:有没有办法通过模块子进程获取运行时间? 例如:runtime = p.runtime()

【问题讨论】:

标签: python subprocess wait popen


【解决方案1】:

我同意 @quamrana 的观点,即最简单的方法是使用线程。

首先,我们需要导入一些标准库模块:

import collections
import subprocess
import threading
import time

我们使用有序字典来跟踪进程及其时间,而不是存储进程的列表。由于我们不知道每个线程需要多长时间,我们需要一些方法来跟踪我们的 {process: time} 对的原始顺序。线程本身可以存储在列表中。

ps = collections.OrderedDict()
ts = []

将与每个进程配对的值初始化为当前时间会使整个事情更清晰,尽管通常不建议将相同的变量用于两个不同的事情(在这种情况下,开始时间后跟进程持续时间)。我们线程的目标只是等待线程完成并将 ps 有序字典从开始时间更新到进程持续时间。

def time_p(p):
    p.wait()
    ps[p] = time.time() - ps[p]

for prcs in batch:
    p = subprocess.Popen([prcs])
    ps[p] = time.time()
    ts.append(threading.Thread(target=time_p, args=(p,)))

现在,我们只需启动每个线程,然后等待它们全部完成。

for t in ts:
    t.start()

for t in ts:
    t.join()

一旦完成,我们就可以打印出每个的结果:

for prcs, p in zip(batch, ps):
    print('%s took %s seconds' % (prcs, ps[p]))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-05
    相关资源
    最近更新 更多