@AlexMine
Учусь

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

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

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

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

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

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

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

Похожие вопросы
22 нояб. 2024, в 08:04
1 руб./за проект
22 нояб. 2024, в 06:06
1500 руб./в час
22 нояб. 2024, в 06:04
1 руб./за проект