не дается. Во всех статьях, которые я видел, либо "ну вот у нас тут две таски с asyncio.sleep(), вот мы их собрали в asyncio.gather, вот они выполнились почти одновременно", либо "вот у нас сервер на 100500 рпс, смотрите код". Я и смотрю этот код, и не понимаю, почему он написан так, как написан. Причем я ж абсолютно уверен, что там далеко не ракетная наука, но какого-то deeper dive не хватает. Что почитать/посмотреть, чтобы наконец воткнуть в то, как асинхронщина в питоне работает? Английский, русский, без разницы. Английский наверное предпочтительнее даже.
можешь начать отсюда http://www.kegel.com/c10k.html
Почитать о мютекс, как он работает. Асинхроность почти одинаковая во всех языках, но в питоне она сделана на генераторах, так что ещё почитай о генераторах, так же почитай документацию питона про asyncio.
> Асинхроность почти одинаковая во всех языках и в каких же языках она одинаковая? смотря что понимать под "асинхронностью"
Работает по одинаковому принципу, тоесть мютекс, евент луп, таски и так далее
Не, в общих-то чертах я представляю и отличие асинка от тредов (и их обоих от мультипроцессинга), и что такое ивентлуп, я скорее реализацию понять не могу. Например, насколько я понимаю, async используется для объявления корутин, а await - это аналог next(), только для корутин. Но тут же в доке по aiohttp я вижу: async with aiohttp.ClientSession() as session: async with session.get('http://httpbin.org/get') as resp: print(resp.status) print(await resp.text()) Почему статус не await, а text await? Откуда вообще async в контекстных менеджерах взялся?
1. async в контекстных менеджерах взялся из __aenter__ \ __aexit__
Статус уже есть в объекте который тебе вернули
это выглядит примерно так. 1. ты делаешь запрос. уходишь в первый await пока тебе не приедет порция ответа 2. тебе начинат приходить ответ. библиотека парсит заголовки и отдает тебе управление, чтобы ты решил что делать дальше 3. ты делаешь await response.text() который догружает полностью тело ответа и возвращает результат тебе
Статус - это проперти, я не знаю ни одного языка который умеет делать асинхронные поля. Разве что какие-то с акссесором (но зачем?) await resp.text() - text() - асинхронная функция
А await там нужен для того, чтобы ты видел текст, а не объект Future
Окей, так в принципе начинает проясняться что-то. А в чем тайный смысл асинковых enter-exit? Ну в смысле, я знаю, что в синхронном виде они используются для контекстных менеджеров, а тут соответственно для асинхронных КМ, но что именно нам это дает?
В обычном контекстном менеджере нельзя во время входа или выхода сделать что-то асинхронное.
здесь это нужно чтобы корректно закрыть сессию.
О, вот как. Тоже прояснилось.
То есть async with нам нужен только для того, чтобы в нем мы могли await'ить реквесты, иначе это мог бы спокойно быть и обычный with. Верно?
нет. async with нужен затем что в методах __aenter__ и __aexit__ могут быть await конструкции грубо говоря
session = aiohttp.ClientSession() ... await session.close()
Так. То есть, если бы session.close() не был async, мы могли бы писать with, а не async with? Другими словами, могу ли я эвэйтить что-то внутри обычного, не асинхронного with?
Обсуждают сегодня