@AlexMine
Учусь

Как построить асинхронного чат-бота для вк?

Здравствуйте, начал разбираться с асинхронным программированием, посмотрел видео, почитал статьи и решил сделать чат бота для вконтакте. Но не знаю как правильно теперь его организовать. В синхронном коде у меня была логика такая:
Есть Функция которая устанавливает соединение с longpoll сервером и ждет событие, если событие приходит, то она вызывает функцию бота передавая в нее нужные параметры.

Сейчас же я пытаюсь понять как лучше поступить, у меня есть 2 варианта.
Вариант 1:
Функцию соединения с longpoll сервером сделать асинхронной, добавить ее в tasks несколько раз и запустить, получается что будет открыто несколько соединений(если конечно я правильно понимаю), и каждая функция уже будет вызывать функцию бота(она тоже ассинхронная).

Вариан 2:
Открыть только 1 соединение с longpoll сервером, в этом соединение все события приходящие буду класть в очередь. Функцию бота добавить несколько раз в task, и они будут постоянно проверять наличие в очереди событий через while True и дальше выполнять нужный код.

Извиняюсь, если что-то представляю вообще не так как нужно, только начал разбираться с асинхронным кодом, пытаюсь вникнуть в суть.
  • Вопрос задан
  • 889 просмотров
Решения вопроса 1
YardalGedal
@YardalGedal
yeah boy
Во-первых, почитайте про vk callback api. На основе асинхронного веб-сервера типа aiohttp или tornado будет очень быстро.
Во-вторых, на сколько я понял, вы хотели использовать список вместо очереди. Не нужно. Если уж использовать, то хотя бы queue.Queue.
В-третьих, первый вариант явно провальный, будет работать не очень круто, если даже заставите хоть как-то работать. Второй вариант выглядит более логичным, если всё таки решите использовать лонгпулл, но здесь без многоточности/многопроцессорности, думаю, не обойтись.

В итоге: если делать через лонгпулл самый простой вариант - один процесс/поток с бесконечным циклом, который делает await session.get(longpoll_url).json(), далее ЛИБО добавляет задания в очередь для хендлера, который работает во втором процессе с таким же бесконечным циклом, ЛИБО порождает новый поток/процесс для каждого нового сообщения. Но здесь сразу же, даже до этапа проектирования, видно много узких мест. Если делать через колбек - узких мест, фактически, нет. Например, многопроцессорный асинхронный торнадо (но уступающий в однопотоке по-умолчанию асинхронному aiohttp), справится с любой нагрузкой, узких мест нет, он, по сути, сам в своих потоках/процессах будет разгребать новые запросы, вам об этом думать будет не надо.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект
18 апр. 2024, в 21:56
2000 руб./за проект