为while循环实现超时的最佳方法

时间:2016-07-03 06:14:28

标签: python time

我有一个while循环

while somecondition:
    dostuff

(抱歉。很难给出一个可执行的例子,因为这是一个大项目的一部分。)

大多数情况下,在短时间内满足条件并且循环到期。但有时候这种情况永远不会得到满足。我怎样才能最好地抓住这种情况?计时器是最好的选择吗?我怎样才能最好地实现它?

4 个答案:

答案 0 :(得分:8)

您可以使用SIGALRM使用超时。这是一个演示它的小程序。

import sys

import time
import signal


class TimeoutError(Exception):
    pass

def _sig_alarm(sig, tb):
    raise TimeoutError("timeout")

def main(argv):
    timeout = 7
    signal.signal(signal.SIGALRM, _sig_alarm)
    try:
        signal.alarm(timeout)
        while True:
            print("sleeping...")
            time.sleep(1)
    except TimeoutError:
        pass
    print("Out of loop.")



main(sys.argv)

这会设置一个信号处理程序,它只会引发一个自定义异常(但你可以使用任何异常),然后捕获它。

答案 1 :(得分:1)

等一小时的例子

from datetime import timedelta
delete_TO = 1
wait_until = datetime.now() + timedelta(hours=delete_TO)
break_loop = False
while not break_loop:
     do-your loop-stuff
     if wait_until < datetime.now() or somecondition:
          break_loop = True

(编辑:wait_until必须小于datetime.now())

答案 2 :(得分:0)

写一个for循环怎么样?或者你可以实现像timer = 0这样的东西,每次你通过循环时都会增加它。例如,如果您想在100次迭代后中断,则可以编写if语句。如果计时器== 100则中断。

答案 3 :(得分:0)

正确的答案是

from datetime import timedelta
delete_TO = 1
wait_until = datetime.now() + timedelta(hours=delete_TO)
break_loop = False
while not break_loop:
     do-your loop-stuff
     if wait_until < datetime.now() or somecondition:
          break_loop = True

此代码是从@ohad_the_lad(https://stackoverflow.com/users/2468201/ohad-the-lad)答案中复制粘贴的,但它修复了如果wait_until大于datetime.now()时循环退出的无意识错误。