Всё таки aiohttp это асинхронный фреймворк, однако типичных казусов асинхронности отловить не удалось.
По сему я как-то не очень понимаю, как он работает?
Допустим, я хочу посчитать переменную b, которая просто на бекенде приравнивается к переменной a, которая в свою очередь достаётся из базы.
Путь это будет происходить так: есть коррутина, в которой происходит присваивание b=a при помощи запуска другой подпрограммы, которая выполняет запрос к базе - лезет туда за переменной a.
Эти задачи разделены и в event loop попадают как разные. причем определяется сперва подпрограмма, которая лезет в базу. Очевидно, что она будет выполняться дольше чем простое присваивание b=a, поэтому event loop перейдёт сразу к присваиванию. Значит обработка не похожа на синхронную. Как это работает? Везде пишут, что aiohttp позволяет запускать асинхронные воркеры и при этом писать код так, будто бы он синхронный.
Я могу полностью положиться на это утверждение?
Должны ведь быть какие-то оговорки? Для повышения производительности лучше писать коррутины маленькими и разбивать задачи на кучу подпрограмм? или напротив, лучше всё запихивать в одну коррутину?
Сергей Горностаев
@sergey-gornostaev Куратор тега Асинхронное программирование
Седой и строгий
Везде пишут, что aiohttp позволяет запускать асинхронные воркеры и при этом писать код так, будто бы он синхронный.
Херню пишут.
поэтому event loop перейдёт сразу к присваиванию.
Нет, вся цепочка асинхронных вызовов от кода принявшего клиентское соединение до кода лезущего в базу остановится в ожидании данных, а цикл событий побежит дальше обслуживать другие цепочки и проверит готовность данных на следующей итерации.
Теперь понятно, почему присваивание проходит верно.
То есть я всегда могу положиться на то, что если коррутина нуждается в данных от другой коррутины, казуса с последовательностью их выполнения не произойдёт?
А что скажете по поводу
Для повышения производительности лучше писать коррутины маленькими и разбивать задачи на кучу подпрограмм? или напротив, лучше всё запихивать в одну коррутину?
А в чём тогда отличия? кроме async await и запуска eventloop'ов, разумеется. В чём будет состоять разница в логике реализации? Я уже пописал немного и прочёл официальное руководство - действительно возникло впечатление, будто структура кода похожа на то, как это выглядит, например, во flask.
Написано
Сергей Горностаев
@sergey-gornostaev Куратор тега Асинхронное программирование
Скажу, что это всегда хорошая практика, даже в однозадачном коде.
А в чём тогда отличия?
Ух, это в двух словах не описать. Но асинхронный код редко для кого является интуитивно понятным. Намного чаще только кажется таковым. Многозадачность вообще простой не бывает, на чём бы она не была реализована.
Скажу, что это всегда хорошая практика, даже в однозадачном коде.
Имеете ввиду разбитие задач на маленькие подпрограммы, на сколько я понял.
Написано
Сергей Горностаев
@sergey-gornostaev Куратор тега Асинхронное программирование
toddbarry, а неважно, что именно служит причиной разбиения - просто организация кода или контекст его выполнения, принцип единственной ответственности во всех случаях справедлив.