214 похожих чатов

Ребят, а можно ещё наивный архитектурный вопрос) У нас был бот

на синхронной либе.
В какой-то момент он стал долго отвечать людям. Потому что запросов стало много, выполняются они не мгновенно (есть же запросы к бд и апи может).
Тогда мы сделали обработку в несколько потоков. Допустим 10. И всё стало ок. Для каких-то критичных вещей, где, например, изменялись важные параметры в бд, мы сделали отдельный поток (чтобы нельзя было 2 раза списать сумму с баланса например, если суммы не хватает. Ну да не суть).

Сейчас я перевожу бота на асинхронные либы.
И вроде вот эти потоки - это неправильно, для обработки сообщений.
Как тут правильно поступить? У меня есть 1 опасение:
1. При отказе от потоков бот снова будет долго отвечать пользователям. Ведь раньше было 10 параллельных потоков, а теперь будет один, пусть и с асинхронной работой.

Чувствую, что ответ простой, но я его не вижу из-за недостатка опыта.

13 ответов

12 просмотров

не знаю как там в питоне, но общая концепция такая: 1) Принимаешь сообщения и сразу отдаешь 200 телеге 2) Сообщения складываешь в брокер очередей 3) Есть пул консьюмеров которые эти сообщения разгребают

Лови первую ссылку в Гугле https://highload.today/asinhronnost-v-python-kak-twitter-obrabatyvaet-milliardy-seansov-v-den/

Ruslan-Gabdrakhmanov Автор вопроса
Magic
не знаю как там в питоне, но общая концепция такая...

Ну вот мы примерно так через потоки делали. А тут чёт не пойму, как правильно

Ruslan-Gabdrakhmanov Автор вопроса
Vorobuskaᅠ Forever
Лови первую ссылку в Гугле https://highload.today/...

Как будто не совсем то, слишком общее описание. Или я не очень догоняю. Чуть позже прочитаю нормально (пока пробежался глазами просто). Но спасибо!

Не правильно понимаешь. Асинхронная обработка предпологает то, что ты отдаешь управление другим корутинам, пока текущая ждет, скажем, данные из базы данных. Так что все наоборот станет быстрее. Надо понимать, что асинхронка - она не про скорость, а про скорость в пересчете на ресурсы. Тоесть, на потоках тебе надо N оперативки и X процессора, то на асинхронке тебе нужно N/10 и X/3 процессора. (цифры с потолка конечно, всё зависит от задачи). Потоки тебе нужны, если ты там делаешь чтото, что требует процессора(нейроночка), а не просто ждешь базу данных/http-вызов внешнего api. Это означает, что если большая часть работы у тебя - это процессор(нейроночка, ресайз фото итд), то асинхронка тебе в принципе не нужна - разве что для удобства и однообразия. Но, как правильно сказал @temamagic, если у тебя тяжелые процессы - то их надо делать через очередь и отдельные процессы-воркеры, а не в основном процессе бота.

Ruslan-Gabdrakhmanov Автор вопроса
Rocket
Не правильно понимаешь. Асинхронная обработка пре...

Не тяжелые. Понимаю, что в случае синхронного кода тормоза были из-за базы и запросов к апи. Но тогда функции мне надо не просто через await function() вызывать, а таски создавать? Иначе прироста к скорости не будет? Я же верно понимаю?

Ruslan Gabdrakhmanov
Не тяжелые. Понимаю, что в случае синхронного кода...

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

Ruslan-Gabdrakhmanov Автор вопроса
Kirill ‌Grinchuk
Именно так Но зачастую асинхронные фреймворки сами...

Ну в случае всяких сендмесседжей, может. Обычно функция состоит из: запрос к бд (mariadb + aiomysql) просты быстрые расчёты\условия ответ пользователю (aiogram) Непонятно, как на текущем этапе принять решение о том, оборачивать всё в таски или просто убрать потоки и на этом всё

Ruslan Gabdrakhmanov
Ну в случае всяких сендмесседжей, может. Обычно фу...

А ты сделай две версии, и посмотри какая будет лучше работать

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

Ruslan-Gabdrakhmanov Автор вопроса
Fᴏʀᴅᴇɴ
прелесть асинка в том, что во время долгого запрос...

❤️ спасибо. Надо тесты провести, чтобы делали реализации уточнить

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта