как прервать цикл for по истечению таймера
я делаю бота для вконтакте где прием сообщений должен прирваться спустя некоторое время после его начала и я сделал такой код
tm = time.time()
for event in bot_longpoll.listen():
if (time.time()-30)<tm:
#ответ на сообщение
else:
break
event это любое событие - например пользователь оставил комментарий или отправил сообщение в группу а функция bot_longpoll.listen()- генератор который возвращает эти события ввиде списка (просто для понимания). Казалось бы можно ограничится простой проверкой прошло ли условных 30 секунд но он это проверяет каждое событие соответственно если событий никаких не происходит он это не проверяет и не сможет выключится в нужный момент. Так как все таки выключить такой цикл четко по таймеру независимо происходят события или нет?
Ответы (3 шт):
Исследуй возможности try except. Есть такая штука в Питоноузе. Try-except - это конструкция в языке программирования Python, которая используется для обработки исключений. Исключения возникают, когда в процессе выполнения программы происходит ошибка. Конструкция try-except позволяет программисту предусмотреть возможные ошибки и управлять ими.
Конструкция try-except имеет следующий синтаксис: try: блок кода, в котором может возникнуть ошибка например, деление на ноль или обращение к несуществующему индексу списка except Исключение1: блок кода, который выполняется, если возникло исключение Исключение1 except Исключение2: блок кода, который выполняется, если возникло исключение Исключение2 else: блок кода, который выполняется, если исключение не возникло finally: блок кода, который выполняется всегда, независимо от того, возникло исключение или нет При возникновении исключения в блоке try, выполнение кода переходит к соответствующему блоку except, который обрабатывает это исключение. Если исключение не возникает, то выполняется блок else. Блок finally выполняется в любом случае, даже если возникло исключение.
tm = time.time()
while (time.time()-30) < tm:
for event in bot_longpoll.listen():
#ответ на сообщение
time.sleep(1) # пауза в 1 секунду (можно изменить - тип float)
1 раз в секунду (в 0.5 секунды, через 0.1 секунды...) проверяем эвенты. Если они есть, то отвечаем, если эвентов нет, то через 30 секунд цикл while закончится.
from time import sleep
timer = 0
for event in bot_longpoll.listen():
sleep(0.5)
timer += 0.5
if event:
timer = 0
if timer > 30:
break
ждет 0.5с, затем проверяет есть ли эвенты (if event), и если они есть, то обнуляет таймер. Если таймер больше 30 секунд, то вырубает цикл (break). Таймер прибавляет по 0.5 каждое повторение цикла (timer += 0.5)