на синхронной либе.
В какой-то момент он стал долго отвечать людям. Потому что запросов стало много, выполняются они не мгновенно (есть же запросы к бд и апи может).
Тогда мы сделали обработку в несколько потоков. Допустим 10. И всё стало ок. Для каких-то критичных вещей, где, например, изменялись важные параметры в бд, мы сделали отдельный поток (чтобы нельзя было 2 раза списать сумму с баланса например, если суммы не хватает. Ну да не суть).
Сейчас я перевожу бота на асинхронные либы.
И вроде вот эти потоки - это неправильно, для обработки сообщений.
Как тут правильно поступить? У меня есть 1 опасение:
1. При отказе от потоков бот снова будет долго отвечать пользователям. Ведь раньше было 10 параллельных потоков, а теперь будет один, пусть и с асинхронной работой.
Чувствую, что ответ простой, но я его не вижу из-за недостатка опыта.
не знаю как там в питоне, но общая концепция такая: 1) Принимаешь сообщения и сразу отдаешь 200 телеге 2) Сообщения складываешь в брокер очередей 3) Есть пул консьюмеров которые эти сообщения разгребают
Лови первую ссылку в Гугле https://highload.today/asinhronnost-v-python-kak-twitter-obrabatyvaet-milliardy-seansov-v-den/
Ну вот мы примерно так через потоки делали. А тут чёт не пойму, как правильно
Как будто не совсем то, слишком общее описание. Или я не очень догоняю. Чуть позже прочитаю нормально (пока пробежался глазами просто). Но спасибо!
Не правильно понимаешь. Асинхронная обработка предпологает то, что ты отдаешь управление другим корутинам, пока текущая ждет, скажем, данные из базы данных. Так что все наоборот станет быстрее. Надо понимать, что асинхронка - она не про скорость, а про скорость в пересчете на ресурсы. Тоесть, на потоках тебе надо N оперативки и X процессора, то на асинхронке тебе нужно N/10 и X/3 процессора. (цифры с потолка конечно, всё зависит от задачи). Потоки тебе нужны, если ты там делаешь чтото, что требует процессора(нейроночка), а не просто ждешь базу данных/http-вызов внешнего api. Это означает, что если большая часть работы у тебя - это процессор(нейроночка, ресайз фото итд), то асинхронка тебе в принципе не нужна - разве что для удобства и однообразия. Но, как правильно сказал @temamagic, если у тебя тяжелые процессы - то их надо делать через очередь и отдельные процессы-воркеры, а не в основном процессе бота.
Не тяжелые. Понимаю, что в случае синхронного кода тормоза были из-за базы и запросов к апи. Но тогда функции мне надо не просто через await function() вызывать, а таски создавать? Иначе прироста к скорости не будет? Я же верно понимаю?
Именно так Но зачастую асинхронные фреймворки сами все оборачивают в таски, так что возможно тебе не придется делать это самому
Ну в случае всяких сендмесседжей, может. Обычно функция состоит из: запрос к бд (mariadb + aiomysql) просты быстрые расчёты\условия ответ пользователю (aiogram) Непонятно, как на текущем этапе принять решение о том, оборачивать всё в таски или просто убрать потоки и на этом всё
А ты сделай две версии, и посмотри какая будет лучше работать
прелесть асинка в том, что во время долгого запроса в бд бот будет обрабатывать сообщения других пользователей то есть как бы 1 поток, но как только прекращаются вычисления и питон начинает ждать ответа откуда то - он быстренько переходит к другой функции, которая готова к работе
❤️ спасибо. Надо тесты провести, чтобы делали реализации уточнить
это не совсем асинк, а просто очереди)
Обсуждают сегодня