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

2024-05-16 04:34:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段时间的循环

while somecondition:
    dostuff

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

大多数情况下,条件在很短的一段时间后满足,循环将过期。但有时这种条件永远无法满足。我怎样才能最好地抓住这些案子?计时器是最好的选择吗?如何才能最好地实现它?


Tags: 项目情况条件例子计时器while案子dostuff
3条回答

等一个小时的例子

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())

您可以使用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)

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

正确答案是

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_lad(https://stackoverflow.com/users/2468201/ohad-the-lad)答案复制粘贴的,但它修复了如果wait_until大于datetime.now()则循环退出的意外错误,而该错误将始终发生。

相关问题 更多 >