【问题标题】:Best way to have a task in python run until timeout在 python 中运行任务直到超时的最佳方法
【发布时间】:2018-06-26 15:23:52
【问题描述】:

我正在处理的一个 Python 项目要求一个任务在一定的时间限制内运行完成。如果在完成之前达到时间限制,则终止整个任务。

最初,我想使用一个while循环来检查时间;但是,这仍然意味着将通过循环检查一次时间。有没有最佳的方法来解决这个问题?

【问题讨论】:

  • 欢迎来到 Stack Overflow!您能否用一些最小的示例代码来说明您的问题,最好使用minimal reproducible example?像这样,在我看来,这个问题很模糊,不太可能得到非常有用的答案。

标签: python timeout


【解决方案1】:

如果您想在循环中的多个点检查运行时(而不是每个循环只检查一次),您可以编写一个函数来执行此操作。

from time import time

start_time = time()
max_runtime = 1000 # maximum runtime in seconds

def end_loop():
    if time()-start_time > max_runtime:
        return True
    else:
        return False

然后您可以在循环中的各个点插入它,如下所示:

while time()-start_time < max_runtime:
    # do some stuff
    if end_loop():
        break

    # do some more stuff
    if end_loop():
        break

这样你就不需要等到循环开始才检查运行时。但是,这种方法只允许您在代码中的有限点检查运行时,因为只有在调用 end_loop() 时才可能中断循环。在等待下一个end_loop() 时,您的运行时间可能会超过最大运行时间。

【讨论】:

  • 如果任务花费的时间超过第一个循环中的 max_runtime 会发生什么?
  • 它将在end_loop()第一次出现时中断
  • 不是真的,它只会卡住,直到你的 # do some more stuff 块完成
  • 您必须选择有限的点来检查运行时。您可以在每隔一行代码执行此操作,但无论您在哪里检查,您都无法在最大运行时完全中断循环。
  • 你应该在答案中解释所有这些,反正那里仍然缺少一些日志
【解决方案2】:
import time 

# This will set t_end at 5 minutes
t_end = time.time() * (60 * 5)

while time.time() < t_end:
   if (condition):
       break
   else:
       code

这是我在做你描述的事情时使用的。如果您的任务已完成,它将检查总体时间限制并打破循环。

【讨论】:

  • 如果任务花费的时间超过第一个循环中的 max_runtime 会发生什么?
  • while 循环结束,您可以从那里处理逻辑。有人建议这是一个骨架。可以设置标志来检查任务是否实际完成或计时器是否刚刚运行。
猜你喜欢
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 2010-11-11
  • 1970-01-01
相关资源
最近更新 更多