FTL
Кто нибудь умеет в LongPoll ВК-шный? Конкретно грамотная обработка сообщений. (Та, я знаю что лучше CallBack, но не хочу париться с подъемом серва)
Vladyslav 🇺🇦🇪🇺
Mikhail
А почему тут не любят асинхронные ОРМ? Или я не правильно понял. Просто у меня 5 долгих запросов к БД асинхронно выполняются где-то в 5 раз быстрее чем синхронно
Tishka17
Попробую объяснить. орм нужна когда ты не планируешь вылизывать каждый запрос и выяснять как сделать его супер быстрым. Главное чтобы работал Асинк нужен когда у тебя большая нагрузка и ты хочешь из сервера выжать максимум и бережешь даже треды
Tishka17
Не чувствуешь тут противоречие?
Vladyslav 🇺🇦🇪🇺
Крче Может я не знаю что значит блокирующий код, но по своему опыту - вызов классов внутри корутин блокирует асинхронное исполнение. Бенчмаркал так - берешь список серверов и через контекстный процессор и клиентскую сессию aiohttp и шедулер идешь и вытаскиваешь статус коды Если правильно вме сделать, коды возвращаются рандомно. Не по списку. И возвращаются ахуеть с какой скоростью. Короче отет не ожидается Если в коде воткнуть обращение в классы, по прежнему ответ не ждем но ответы уже приходят по порядрчку
Mikhail
Не чувствуешь тут противоречие?
Нет, я не вылизываю запросы, я вылизываю пять запросов
Mikhail
Или вы про то, что ОРМ внутри себя асинхронно работает?
Tishka17
Собственно да
Ну так вызывай параллельно :)
Tishka17
Или вы про то, что ОРМ внутри себя асинхронно работает?
Мы про использование ОРМ в коде на asyncio
Tishka17
+
Mikhail
Мы про использование ОРМ в коде на asyncio
Все еще не чувствую противоречий с тем чтобы использовать его чтобы параллельно дергать БД(
Tishka17
Все еще не чувствую противоречий с тем чтобы использовать его чтобы параллельно дергать БД(
Для того чтобы параллельно дергать БД не нужен асинкио. Просто дергай параллельно
Tishka17
И не надо париться вообще
Tishka17
Не знаю, ThreadPoolExecutor, Pool.map всякие есть
Mikhail
Для того чтобы параллельно дергать БД не нужен асинкио. Просто дергай параллельно
Ну чтобы «просто дергать параллельно» надо всё равно завести ТредПул какой нибудь
Tishka17
И более аккуратно с ним работать?
Mikhail
Но сейчас там просто тред пул воткнут
Tishka17
Что то, что это
Только асинкио код требует большего внимания. См выше про гарантии отсутствия блокировок
Vladyslav 🇺🇦🇪🇺
Вот именно Декоратор это функция А корутина это корутина
Vladyslav 🇺🇦🇪🇺
Нет?
Vladyslav 🇺🇦🇪🇺
Вызов функции из корутины = блок
Vladyslav 🇺🇦🇪🇺
Не проверял
Vladyslav 🇺🇦🇪🇺
Завтра
Tishka17
Вот именно Декоратор это функция А корутина это корутина
Декоратор вызывается в момент его применения. То есть при создании функции
Tishka17
Ты обычно не вызваешь декоратор из своей корутины. Ты вызваешь декорированную функцию
Tishka17
Корутина - функция, которая возвращает объект, который можно эвейтить ;-)
Vladyslav 🇺🇦🇪🇺
Ты обычно не вызваешь декоратор из своей корутины. Ты вызваешь декорированную функцию
Деворированная функция это та же функция Вызов ее из корутины = блок
Tishka17
Декорированная функция вполне может быть корутиной
Vladyslav 🇺🇦🇪🇺
🤷‍♂
Tishka17
Собственно async def x(): pass def y(): return x() Ничем особо не отличаются
Vladyslav 🇺🇦🇪🇺
Кроме того что первое это корутина а второе нет:)
Nikolay Markov
Корутина - это всего лишь функция с несколькими точками входа и выхода
Tishka17
Кроме того что первое это корутина а второе нет:)
Ага. Вот только делают они абсолютно одно и то же
Vladyslav 🇺🇦🇪🇺
Собственно async def x(): pass def y(): return x() Ничем особо не отличаются
Кстати, разве это валидно? Вызывать из функции корутину?
Nikolay Markov
Vladyslav 🇺🇦🇪🇺
Ага. Вот только делают они абсолютно одно и то же
Так никто не спорит что это одно и тоже Механизм исполнения разный
Vladyslav 🇺🇦🇪🇺
И для правильной работы корутин т.е. без блоков, миксовпть код с синхронным нельзя
Vladyslav 🇺🇦🇪🇺
Nikolay Markov
И для правильной работы корутин т.е. без блоков, миксовпть код с синхронным нельзя
У тебя так или иначе под асинхронными корутинами будет тонна синхронных вызовов
Vladyslav 🇺🇦🇪🇺
За авейтить нужно как минимум
Nikolay Markov
Ты этого никак не избежишь
Tishka17
import asyncio async def x(): await asyncio.sleep(1) print("x") def y(): return x() async def main(): await x() await y() loop = asyncio.get_event_loop() loop.run_until_complete(main()) loop.close()
Tishka17
Валидно, только она не выполнится
Ну она выглядит как обычная функция, а работает как асинхронная. ))
Nikolay Markov
Он же не awaitable
Tishka17
Специально проверил
Vladyslav 🇺🇦🇪🇺
У тебя так или иначе под асинхронными корутинами будет тонна синхронных вызовов
В том смымле от асинхрона смысла нет В этом и фишка чтоб придерживаться асинхронной истории чтоб получить с этого профит
Tishka17
x() возвращает объект, на который можно делать await
Mikhail
Упадёт на await y(), не?
Он выполнится и вернет корутину же
Tishka17
y() ничего не делает, просто передаёт его выше
Mikhail
Во втором питоне асинкио выглядит менее запутано)
Tishka17
Собственно type(x) - function
Mikhail
Собственно type(x) - function
Не генератор разве?
Nikolay Markov
Tishka17
А вот type(x()) - coroutine
Nikolay Markov
+1
Vladyslav 🇺🇦🇪🇺
С одной стороны да, с другой стороны ты этого по определению сделать не сможешь
Я могу добиться видимости асинхронного исполнения о котором я писал выше, где писал про бенчмарк
Vladyslav 🇺🇦🇪🇺
А вот type(x()) - coroutine
Ну дык Все верно
Tishka17
Эм?
Asyncio завезли где-то в 3.4
Nikolay Markov
Эм?
Во втором питоне нет asyncio
Mikhail
Tishka17
Ну дык Все верно
Угадаешь type(y) и type(y())?
Nikolay Markov
Я могу добиться видимости асинхронного исполнения о котором я писал выше, где писал про бенчмарк
Ты можешь что угодно, но у тебя всё равно в коде будут синхронные вызовы
Mikhail
trollius называется чтоли