vk_api icon indicating copy to clipboard operation
vk_api copied to clipboard

Как обрабатывать обращения к боту VK асинхронно, чтобы пользователю не приходилось ждать, пока предыдущий получит ответ?

Open ghost opened this issue 5 years ago • 3 comments

Сейчас мой бот в Вк обрабатывает сообщения синхронно:

  1. Получил сообщение от пользователя,
  2. Формирует для него ответ и отправляет *При этом если напишет кто-то ещё, то бот не ответит ему, пока не закончит с предыдущим пользователем.

Но мне нужно, чтобы бот получал сообщение от пользователя и сразу переходил к следующему, даже если на предыдущее сообщение, которое получил бот ответ еще на этапе формирования.

Ранее я уже задавал похожий вопрос и мне посоветовали библиотеку "multiprocessing", однако я не понимаю, каким образом её можно применить конкретно в моем случае. Вот пример того, как работает сейчас (синхронно) с использованием longpoll:

import vk_api

def main():
    # Подключение по токену сообщества, создание объекта longpoll
    session = vk_api.VkApi(token='xxxxxxxxxxxxxxxx')
    longpoll = VkBotLongPoll(session, group_id='xxxxxxxxxxxxxxxx')
    for event in longpoll.listen():
        # Если получено сообщение
        if (event.object.text):
            # Формируем ответ
            generate_response(event.object.text)


if __name__ == '__main__':
    main()

Как можно сделать, чтобы эта часть кода, принимающая сообщения и формирующая ответ работала асинхронно и пользователю не приходилось ждать, пока предыдущий пользователь получит ответ?

ghost avatar Jan 15 '20 00:01 ghost

Можно это вынести в поток. Вот моя обёртка для создания ботов, здесь я это реализовал через именной поток, вынесенный в класс.

nenkoru avatar Jan 16 '20 10:01 nenkoru

  1. Использовать асинк либы как предложили выше. Например vkbottle или vkwave
  2. Все запросы от пользователей отправлять в очередь (radis или rabbitmq) и возвращать Вконтакте 'ok', а дальше запустить несколько воркеров которые будут доставать запросы из очереди и обрабатывать.

MrSmitix avatar Apr 27 '20 09:04 MrSmitix