python - 如果函数花费的时间太长,则跳过循环?

标签 python numpy

我的 Python 代码花费的时间太长,如果它花费的时间超过几秒钟,我想停止并跳过该函数的执行。

比如我要计时的函数是:

batch_xs, batch_ys = train_loadbatch_from_lists(batch_size)

在某些情况下,这个函数调用花费的时间太长,我想取消它。

我正在寻找这样的东西:

if time for batch_xs, batch_ys = train_loadbatch_from_lists(batch_size) > 20 seconds:
    then skip

引用this post .

我想知道如果发生超时我将如何再次调用该函数。

例如

@timeout(15)
def abcd(hello):
#some def 

如果超过定时器,我想再次调用该函数。

最佳答案

当你在同一个线程中调用一个函数时,它通常不会在完成之前返回。您调用的函数实际上必须首先设计为可中断的。实现这一目标的方法有很多,复杂性和通用性程度各不相同。

可能最简单的方法是将时间限制传递给您的函数,并以小块的形式处理工作。处理完每个chunk后,检查耗用时间是否超过超时时间,如果超过则提前bail。

下面的例子说明了这个想法,每个 block 的工作时间是随机的,有时会完成,有时会超时:

import time
import random
import datetime

class TimeoutException(Exception):
    def __init__(self, *args, **kwargs):
        Exception.__init__(self, *args, **kwargs)

def busy_work():

    # Pretend to do something useful
    time.sleep(random.uniform(0.3, 0.6))

def train_loadbatch_from_lists(batch_size, timeout_sec):

    time_start = datetime.datetime.now()
    batch_xs = []
    batch_ys = []

    for i in range(0, batch_size+1):
        busy_work()
        batch_xs.append(i)
        batch_ys.append(i)

        time_elapsed = datetime.datetime.now() - time_start
        print 'Elapsed:', time_elapsed
        if time_elapsed > timeout_sec:
            raise TimeoutException()

    return batch_xs, batch_ys

def main():

    timeout_sec = datetime.timedelta(seconds=5)
    batch_size = 10
    try:
        print 'Processing batch'
        batch_xs, batch_ys = train_loadbatch_from_lists(batch_size, timeout_sec)
        print 'Completed successfully'
        print batch_xs, batch_ys
    except TimeoutException, e:
        print 'Timeout after processing N records'

if __name__ == '__main__':
    main()

实现此目的的另一种方法是在单独的线程中运行辅助函数,并使用 Event 允许调用者通知辅助函数应该提前终止。

一些帖子(例如上面链接的帖子)建议使用信号,但不幸的是信号会导致额外的并发症,因此不推荐。

关于python - 如果函数花费的时间太长,则跳过循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36762283/

相关文章:

python - 安装 tfprof 命令行

python - numpy 切片和索引不同的结果

python - 在不同的列名上合并两个不同的数据框

python - 如何在数据框中的电话号码之前添加国家/地区代码(+852)

python - 如何计算圆的交点体积和直线上方的面积。我也想申请一下。 - Python

python - Numpy 搜索子集中数组的元素

python - 如何检索两个 3D 向量之间的角度?

python - 训练和测试集上的不同标签编码器值不好吗?

python - 根据其他列的日期和时间创建新列

python - 如何使用 python 以一种自然的人类可读的方式绘制与时间相关的信息?