我有一个
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
如果它穿过计时器,我想再次调用该函数.
最佳答案 在同一个线程中调用函数时,通常在完成之前不会返回.您调用的功能必须首先设计为可中断.有许多方法可以实现这一点,具有不同程度的复杂性和通用性.
可能最简单的方法是将时间限制传递给您的函数,并以小块的形式处理工作.处理完每个块后,检查经过的时间是否超过超时,如果超过,则提前保释.
下面的例子说明了这个想法,每个块的工作花费了一个随机的时间,有时会完成,有时会超时:
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函数,并使用Event允许调用者发出工作者函数应该提前终止的信号.
一些帖子(例如上面链接的帖子)建议使用信号,但不幸的是信号会导致额外的并发症,因此不建议这样做.