Viber бот отвечает очень медленно
Я написал Viber бота на Python по образу и подобию официальной документации.
Сам по себе бот чрезвычайно простой. Залил его код на сервере, и дал ссылку на WebHook.
Но бот отвечает оче-е-ень долго, после отправки сообщения, бот думает около 7 секунд, и только потом отвечает.
Мне нужно его ускорить, я прошерстил кучу источников, и не понимаю в чем проблема.
WebHook отвечает сразу как получил запрос, сервер быстро все обрабатывает.
В чем ошибка? Помогите, пожалуйста. И огромное спасибо!
Небольшое пояснение для кода, т.к. в Viber есть баг, что если программа не отвечает на запрос в течении пары секунд, то Viber дублирует запрос. Из-за этого и ответ бота может дублироваться. Для решения этой проблемы поднимается очередь в отдельном потоке, которая отвечает на запросы. А WebHook, просто отвечает 200, что бы Viber не слал запросы.
На всех остальных каналах (ВК, виджет), с таким же кодом, очередями, и WebHook-ом, скорость вменяемая, они отвечают почти мгновенно.
Код:
def async_action(f):
"""
Функция обертка
Используется для того, что бы была возможность вызвать
любую функцию асинхронно
Arguments:
f {func} -- функция которая будет обернута
Returns:
[wrapper] -- возвращает обертку
"""
@wraps(f)
def wrapped(*args, **kwargs):
return asyncio.run(f(*args, **kwargs))
return wrapped
app = Flask(__name__)
@app.route('/viber', methods=['POST', 'GET'])
@async_action
async def viber_handler():
'''
Получая сообщение через вебхук, создается объект ядра
Передаем полученный запрос далее по логике
Returns:
[Response] -- возвращаем Response(status=200),
что бы viber перестал слать запросы
'''
await processing_message_viber(request)
return Response(status=200)
def set_webhook(viber):
"""
Функция активации вебхука
Arguments:
viber {viber obj} -- Передается для работы с вебхуком
"""
# web_hook_link - Получаем при запуске ngrok,
# храним в configs-server
viber.set_webhook(web_hook_viber_link)
def start_work_queue():
"""
Логику работы Viber смотреть в документации
Данная функция запускает асинхронно функцию
для разгрузки очереди
"""
asyncio.run(work_queue())
if __name__ == "__main__":
scheduler = sched.scheduler(time.time, time.sleep)
scheduler.enter(5, 1, set_webhook, (viber,))
activate_webhook = threading.Thread(target=scheduler.run)
activate_webhook.start()
queue_work = threading.Thread(target=start_work_queue)
queue_work.start()
port = int(os.environ.get("PORT", 4000))
app.run(host='localhost', port=port)