Python:如果subprocess.check_output等待太长时间以接收输出

时间:2017-04-20 01:42:53

标签: python

我已经实现了缓存遗忘算法,并且已经向PAPI library显示L1 / L2 / L3未命中率非常低。但是,如果我减少可用的RAM内存并强制算法开始使用磁盘中的交换空间,我还想看看算法的行为。由于算法是缓存不经意,因此对于同样的问题,与其他非缓存遗忘算法相比,我应该期待更好地扩展到磁盘。

但问题是,很难预测一旦磁盘出现这些算法会有多糟糕。输入大小的小幅增加可能会大大改变算法完成运行所需的时间。因此,如果你想要测试许多算法,如果需要永远完成,那么实验将毫无用处(我当然可以坐下来监视实验,如果使用ctrl+c就可以杀死,但我真的需要睡觉)。

假设算法为ABC。我使用不同的python脚本,每个算法一个。对于不同的输入大小n,我使用subprocess.check_output来调用实现的可执行文件。此可执行文件返回一些统计信息,然后我以合适的格式处理和存储,然后我可以使用R来制作一些不错的图。

这是算法A的示例代码:

import subprocess
import sys
f1=open('data.stats', 'w+', 1)
min = 200000
max = 2000000
step = 200000
iterations = 10
ns = range(minLeafs, maxLeafs+1, step)
incr = 0
f1.write('n\tp\talg\ttime\n')
for n in ns:
    i = 0
    for p in ps:
        for it in range(0, iterations):
            resA = subprocess.check_output(['/usr/bin/time', '-v','./A',n],
            stderr=subprocess.STDOUT)
            #do something with resA
            f1.write(resA + '\n')
            incr = incr + 1
            print(incr/(((len(ns)))*iterations)*100.0, '%', end="\r")
        i = i + 1

我的问题是,如果subprocess.check_output花费太长时间才能收到答案,我可以以某种方式杀死脚本吗?最好的事情是我定义一个截止,比如10分钟,所以如果subprocess.check_output没有收到任何东西,那么杀死整个脚本。

1 个答案:

答案 0 :(得分:1)

如果你正在使用Python 3(并且你的打印调用的格式可能是你的那个),那么check_output实际上已经有一个可能对你有用的超时参数:https://docs.python.org/3.6/library/subprocess.html#subprocess.check_output < / p>