Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果函数花费的时间太长,是否跳过循环?_Python_Numpy - Fatal编程技术网

Python 如果函数花费的时间太长,是否跳过循环?

Python 如果函数花费的时间太长,是否跳过循环?,python,numpy,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

我有太长的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
关于

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

比如说

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

如果函数跨越计时器,我想再次调用该函数。

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

可能最简单的方法是将时间限制传递给函数,并分小块处理工作。在处理每个区块后,检查所经过的时间是否超过超时,如果超过超时,则提前退出

以下示例说明了这一想法,每个区块的工作需要随机的时间,有时会完成,有时会超时:

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()
实现这一点的另一种方法是在单独的线程中运行worker函数,并使用
事件
允许调用方发出信号,指示worker函数应该提前终止


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

这里有一些想法:是的,我已经看过了。但我不确定我是否知道如何使用它。因此,如果在函数定义之前定义了@timeout(15),并且出现错误,我希望再次调用它。你知道怎么做吗?我真的不建议使用信号。它们看起来是一个不错的解决方案,但有各种奇怪的副作用、角落案例等,最终可能导致比它们解决的问题更多的问题。