我有一个while循环
while somecondition:
dostuff
(抱歉。很难给出一个可执行的例子,因为这是一个大项目的一部分。)
大多数情况下,在短时间内满足条件并且循环到期。但有时候这种情况永远不会得到满足。我怎样才能最好地抓住这种情况?计时器是最好的选择吗?我怎样才能最好地实现它?
答案 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()时循环退出的无意识错误。