如果函数耗时太长,跳过循环?

Ars*_*tic 6 python numpy

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

比如我要计时的函数是:

batch_xs, batch_ys = train_loadbatch_from_lists(batch_size)
Run Code Online (Sandbox Code Playgroud)

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

我正在寻找这样的东西:

if time for batch_xs, batch_ys = train_loadbatch_from_lists(batch_size) > 20 seconds:
    then skip
Run Code Online (Sandbox Code Playgroud)

参考这篇文章

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

例如

@timeout(15)
def abcd(hello):
#some def 
Run Code Online (Sandbox Code Playgroud)

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

gav*_*inb 2

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

也许最简单的方法是将时间限制传递给您的函数,并以小块的方式处理工作。处理完每个块后,检查经过的时间是否超过超时时间,如果超过,则提前退出。

下面的示例说明了这个想法,每个块的工作花费随机的时间,有时会完成,有时会超时:

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()
Run Code Online (Sandbox Code Playgroud)

实现此目的的另一种方法是在单独的线程中运行辅助函数,并使用 来Event允许调用者发出信号以指示辅助函数应提前终止。

有些帖子(例如上面链接的帖子)建议使用信号,但不幸的是信号可能会导致额外的复杂性,因此不建议使用。