Как узнать что превышено время ответа?
Есть бот VK на Python (вот фрагмент):
for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW:
if event.peer_id == ID_GROUP and (INPUT_TEXT_FINALE in str(event.text)): #условие2
<код>
Мне нужно, чтобы если время после последнего выполнения условия2 было больше 10 секунд,т.е. на сообщение нет ответа, то выполнялся код.
Пытался реализовать с помощью time.time()
time2 = 0
for event in longpoll.listen():
time1 = time.time()
if event.type == VkEventType.MESSAGE_NEW:
if time1-time2>10 and time1-time2!=time1:
<код>
if event.peer_id == ID_GROUP and (INPUT_TEXT_FINALE in str(event.text)):
time2 = time.time()
<код>
Но он срабатывает редко...
Надеюсь понятно изъяснил проблему)
Ответы (1 шт):
Проблема заключается в том, что метод longpoll.listen() - просто цикл while True. Вот код этого метода.
Наивный вариант решения проблемы - вынести цикл for event in longpoll.listen() в отдельную функцию и убивать ее через 10 секунд, если нет ответа. Это можно сделать, используя модуль multiprocessing. Вот его документация: https://docs.python.org/3/library/multiprocessing.html
При этом нужно понимать, что функция будет запускаться в отдельном процессе, поэтому передача аргументов должна быть реализована средством модуля multiprocessing. Глобальные переменные вашей программы не будут доступны из этой функции.
ОБНОВЛЕНИЕ:
Вот минимальный вариант кода:
from multiprocessing import Process, Value
from time import sleep
def example_function(got_response):
for event in longpoll.listen():
# Сохраняем информацию о том, что ответ получен
got_response.value = 1
if event.type == VkEventType.MESSAGE_NEW:
# условие2
if event.peer_id == ID_GROUP and (INPUT_TEXT_FINALE in str(event.text)):
# <код>
if __name__ == '__main__':
got_response = Value('i', 0)
p = Process(target=example_function, args=(got_response,))
p.start()
sleep(10)
if got_response.value:
print('Ответ был получен!')
print('Функция продолжит работу...')
else:
print('Ответ не был получен за 10 секунд')
print('Убиваю функцию...')
p.terminate()
print('Функция убита!')
p.join()