Основы асинхронности в Python #7: Asyncio, async/await
HTML-код
- Опубликовано: 13 сен 2024
- Мои курсы:
Boosty:
boosty.to/omol...
Patreon:
/ karty-vsekh-41011404
Разбор синтаксиса async/await, немного о декораторе @asyncio.coroutine и о "создании" событийного цикла с помощью модуля asyncio.
На двух примерах:
1. Простая демонстрация работы асинхронной программы с помощью синтаксиса Python 3.4 (декоратор @asyncio.coroutine и yield from), затем переход на синтаксис Python 3.5 с использованием async/await.
2. Второй пример - скачивание 10 файлов. Первый вариант полностью синхронный, второй вариант - асинхронный с помощью asyncio, async/await и библиотеки aiohttp.
Для второго примера придется установить aiohttp:
pip install aiohttp
(или pip3 install aiohttp)
** ИСХОДНЫЙ КОД **
Основных проектов доступен в Patreon:
/ iskhodnyi-kod-26640469
***
🔷 Для донатов. Всегда очень признателен за это:
www.donational...
Весь плейлист:
Основы асинхронности в Python #1: Введение
• Основы асинхронности в...
Основы асинхронности в Python #2: Асинхронность с простыми функциями. Событийный цикл.
• Основы асинхронности в...
Основы асинхронности в Python #3: Асинхронность на колбэках.
• Основы асинхронности в...
Основы асинхронности в Python #4: Генераторы и событийный цикл Round Robin
• Основы асинхронности в...
Основы асинхронности в Python #5: Асинхронность на генераторах
• Основы асинхронности в...
Основы асинхронности в Python #6: Корутины и yield from
• Основы асинхронности в...
Основы асинхронности в Python #7: Asyncio, async/await
• Основы асинхронности в...
Страдал также как и вы в попытке перестроить свой мозг и привычку думать синхронно и вот что помогло именно мне: открываете пайчарм, пишите асинхронные примеры Олега или выдумываете свои, создаёте точку входа main и прям там сразу ставите дебаггер в паузу. А после неспешна и по шагам смотрите как, что и в какой последовательности выполняется. И сразу резко все становится понятно, а работа async/await прозрачна. Await это лишь точки в которых event loop бросает выполнение скрипта на некоторое время и бежит обслуживать следующий скрипт в очереди. И все. Как только второй скрипт спотыкается об await, event loop бежит обслуживать первого, если тот готов. И так до конца.
Спасибо Олегу за прекрасный курс, многое приоткрылось из под ширмы. Приколько знать, как все это работает с минимальным уровнем абстракций. Автору выражаю большую благодарность за потраченное время.❤️
Как же классно Олег объясняешь! От души доначу знаю что помощь твоя не оценима. Спасибо
Не досчитался 2ух уроков:
1) Реализовать часть функционала asyncio по превращению функции в корутину
2) Дописать сервер с сокетами с async/await
Но в целом серия уроков дала ОООООООЧЕНЬ сильный старт в асинхронности, думаю до этих пунктов дойду самостоятельно. Автору огромное спасибо! Даже в 22 году инфа актуальна)
Да, я тоже заметил что сервер с async/await так и не написан, а жаль, пример был бы очень хороший
Господи, как же обалденно. Хочу, чтобы все учебники по Питону были такими.
Спасибо. Олег Молчанов это лучшее что есть по питону в русском ютубе.
Олег, курс огонь, спасибо огрменное!
Тем кто досмотрел до этого видео и ничего не понял сходу (как я при первом подходе):
- Начать смотреть цикл видео с самого начала
- Если повторять за видео,а ещё лучше - ставить на паузу и пытаться самому написать код, а потом смотреть дальше, то всё становится понятно.
Я прям почувствовал, как преисполнился в познании, после того как понял механизм работы yield from (await) =)
- На предыдущих видео дебажить код по строкам тоже очень полезно, особенно, если вы какие-то свои дополнительные примеры придумываете (ответить клиенту что-нибудь сразу после accept-а, например)
- Если сложно - не сдавайтесь! Понимание придёт со временем =)
P.S. Cправедливости ради, request на сессиях тоже работает быстрее, чем обычный get (примерно в два раза), но медленнее чем асинхронный код)
На win10 столкнулся с двумя ошибками(скорее особенностями).
1. Программа заканчивается с ошибкой event loop is closed. Лечится установкой параметра asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()), перед вызовом asyncio.run(main(2))
2. Сохраняется всего 1-2 файла. Проблема в особенности получения времени в Windows. Файлы, тупо, называются одним именем и перезаписывают друг друга. Лечится иным способом именования.
По поводу курса - ОГОНЬ!!! Олег объясняет как боженька) Жаль пропал человек(((
Спустя год вернулся к этому циклу видосов. В первый раз не осознал, слишком поверхностное было понимание. Сейчас смотрел, осознавал, имплементировал все примеры самостоятельно. И вот теперь пришло понимание. Спасибо, Олег. Как всегда очень ценный контент. Надеюсь, что будешь потихоньку продолжать раскрывать непростые и нужные темы.
Воу, какая поставленная речь, какой прекрасный гайд и не так, как другие рассказывают ни то ни сё, воду разливают, просто прекрасно. Видно, что у автора огромный опыт за плечами, однозначно лайк👍
Большое спасибо. Самое лучшее объяснение асинхронности Python которое я увидел. Особенно понравилось, что объяснение началось с азов. Больше узнал и понял про функции генераторы. Последние примеры тоже огонь! С удовольствием задоначу.
спустя 2 года наткнулся на этот плейлист и теперь благодаря нему разобрался во всём концепте async / await, что они из себя представляют и что такое event loop, день прошёл не зря
Потрясающе! Олег, было бы ещё очень интересно послушать от Вас про многопоточность / мультипроцессность / асинхронность, в плане где и что уместно применять. Наверняка у каждой схемы есть какие-то свои побочки на память, загрузку ЦП и т.д.
Крутой курс по базе асинк, Спасибо!
Очень, очень доходчиво. Спасибо, Олег Молчанов. Не знаю, занимаетесь ли преподаванием сейчас, но Вы, сделали очень большое и полезное дело. На мой взгляд - лучшая подача материала, которую я встречал.
Олег, огромное вам спасибо. Как только устроюсь - обязательно с первой зп скину донат! Очень крутые уроки!
В 5 утра записывать видосы по асинхронности :) большой риспект вам
Олег, спасибо за еще одну прекрасную серию!
В будущем интересно было бы послушать вас про функциональное программирование на python
Отличный цикл видео. Спасибо огромное.
Сначала на одном дыхании посмотрел всю серию, потом вернулся и на всех лайки поставил :)
Олег, кроме вас таких подробных руководств пока не нашел на Ютубе.
Да, есть конечно курсы разные и т.д. - это отдельная всё таки вещь, там разбираюсь всё от базовых вещей, а потом разбирают на кейсах.
Но ваши разборы в этом формате - очень конкурентные, спасибо.
Ну и конечно: приятный голос, правильно объясняете - вам бы лекции вести :)
Спасибо
@Animus Pexus Не осилил?) Нормальный это ассемблер?
@Animus Pexus Чисто из любопытства) Какие всё же языки вы считаете нормальными и почему? В палемику вступать не собираюсь, просто интересно))
@Animus Pexus Дружище, просто шутка, не хотел обидеть))
@Animus Pexus Go крутой, да?
Невозможно поверить, что может существовать настолько качественный контент)))
Это просто что-то невероятное
Спасибо, Олег!
Одно из полезнейших видео, просмотренных мной в жизни
Большое спасибо за эту отличную серию видеоуроков!
Спасибо. Очень хорошо объясняете. Приятно учиться и все понятно!
Отличные, замечательные уроки. Олег, спасибо за ваш труд. Очень полезный контент.
00:00 Описание библиотеки Asyncio
10:32 Пример: асинхронный вывод чисел и счетчика
24:59 Пример: асинхронная скачка картинок из интернета
Ты просто лучший, спасибо ОГРОМНОЕ!
Огромное спасибо вам, за ценный урок!
Огромное спасибо. Появилось понимание async
Большое спасибо за курс!
Олег, приветствую. Я не по теме видоса. Ты пропал. Это печально) появляйся скорее с новым видео. Если можешь снять видео про Celery или просто рассказать, как удаленно на сервере заставить питоновские скрипты работать по расписанию или по событиям- было бы очень здорово. Я знаю, что ты читаешь комментарии. Надеюсь, прочитаешь и мой. Удачи и спасибо!
MrYoklmn где Олег? Что случилось как так
celery было бы хорошим продолжением серии по django и asyncio
Олег, большое Вам спасибо за проделанную работу. На #5 и #6 усвоение информации для меня пошло немного тяжелее, разрыв шаблонов так сказать, но к этому уроку у меня, видимо, "прогрелся кэш", и информацию впитал на ура. :D Жаль, что вы не продемонстрировали возможность работы с файловой системой не прибегая к синхронной функции... Обратил внимание, что на Вашем канале нет новых видео уже 2 года, надеюсь, что у Вас всё хорошо! Очень понравилась ваша внимательность к деталям и в целом подача материала, Вы замечательный педагог. Возможно, в дальнейшем (по необходимости) ознакомлюсь с другими плейлистами с Вашего канала. Всех благ, очень благодарен!
Спасибо большое. Не пишу на Python но вьінужден его читать)) Интересньій язьік, спасибо за об'ьяснения
спасибо, божественно
Огромное спасибо за данное видео, очень много материала в интернете с неприменимыми к жизни примерами, благодаря вам наконец смог использовать asyncio
Отличные уроки! Спасибо большое!
Автору огромный респект)
Олег, спасибо большое за серию этих видео.
Спасибо. Понравилось. Стало яснее.
Спасибо большое за видео, отличные!
Посмотрел все 7 вдосиков, задонатил, теперь буду переваривать инфу, прояснилось многое, но кое-какие вещи надо ещё переварить и понять.
Спасибо за уроки. Ждем следующих. Очень познавательно.
Спасибо за отличный урок
Жду 8 и 9 часть. Спасибо за видео!
Очень годный контент, спасибо за него. Продолжай в том же духе! Донаты будут!)
Большое спасибо за туториалы!
Настало время начать использовать асинхронный код, но вот провести соплями по реальному примеру некому.
Сама суть ясная была еще на вводных курсах, но внятный вариант реализации только твой )
Очень хороший пример на основе aiohttp. Сама либа не сложная (тот же реквест только асинхронный), но вот не зная о ее существовании я бы бился с requests и ничего бы не добился )))
Спасибо тебе большое!
Олег, спасибо за полезные знания, задонатил.
Спасибо вам Олег
Для тех, у кого зависает асинхронная загрузка. Скорее всего это не баг в коде, а блокировка со стороны сервера. Попробуйте воспользоваться другим котогенератором.
спасибо из 24 года)
Потрясающая серия роликов, спасибо!
большое спасибо за серию видео. очень позновательно
как всегда. Хорошая работа, Олег
Начинало смотреть 22к людей, закончило - 11к. вывод - либо половина умерла от асинхронки, либо она им просто не зашла)
это еще отличный результат, обычно какие-то курсы - первый урок 35к, второй - 20к, десятый - 1.5к)
Либо кто-то нашел для себя решение и не стал смотреть все остальное.
Amarok ты внимательно смотрел курс?
@@user-sv4fu3ik3c Я канал начал смотреть именно с этого видео, потому как мне надо было разобраться именно с asyncio, посмотрел еще другие видео, не по теме асинхронности. Мне нужно было разобраться в вопросе - я нашел объяснение. А уж всей темой в целом я ознакомлюсь как-нибудь потом.
@Sensei - Says Да, спасибо, что переживали за меня все это время.
Топовый контент по asyncio в русском ютубе.
Олег, ну вы серьезно считерили в своем сравнении синхронной и асинхронной загрузки картинок. Вы получили около 12 сек при синхронной загрузке, и около одной сек при асинхронной. Вот только в первом случае вы не использовали сессию, а во втором использовали! Выглядит все так, как будто производительность увеличилась в 12 раз из-за асинхронности. На самом же деле эксперимент не чистый.
Проверил у себя, получил такие цифры:
без сохранения сессии на 10 запросов уходит 2-3 сек
если запрашивать в рамках одной сессии ~1,5 сек
asyncio + session - около 1 сек.
А вообще спасибо, вас приятно смотреть, все грамотно, чувствуется хорошее понимание.
и в чем причина этого?
@@Das.Kleine.Krokodil В том что с использованием Session при направлении запроса к хосту у вас не будет устанавливаться новое соединение, а будет переиспользовано старое. Соответственно экономится время.
И по моим замерам на моих примерах получилось, что именно это в первую очередь дало прирост скорости, а уже во вторую асинхронность.
@@dv-key спасибо
спасибо огромное этому человеку!
честь и хвала. спасибо!
Если честно, пока сам не начал играться с асинхронность - все объяснения как об стенку горох. Сделал на grequests + asyncio быстрый асинхронный парсер заголовков страниц (в качестве теста). Сравнил с тем же решением на обычных реквестах и многопроцессорности - реально быстрее получается на асинхроне прогрузить пачку страниц.
Если кому интересно, могу показать код.
Интересно, покажите!
Макс привет
Спасибо. Тяжело дается :)))))))
Класс! Спасибо большое!
Спасибо огромное вам! Жаль что это всё что я могу сделать) Не представляю где бы я брал эту инфу. В жизни бы не подумал что асинхронность основана на генераторах
Спасибо, Олег!
Сотни лайков!!!! ❤❤❤
Очень круто, спасибо большое за курс, но где же реализация примера из первого видео на async await?)
Долго не мог понять как все-таки устроена функция await, когда хотел именно использовать синхронные методы (вместо aiohttp), но эта статья окончатель все пояснила: habr.com/ru/post/453348/
P.S. благодаря предыдущим видео разобрался легко в статье.
Шикарно
Огонь!
Супер🤟
Классно объясняешь, но не слова про async for, этим можно было бы еще упростить код в последнем примере (допускаю, что в 2018 его могло еще не быть, но вроде все-таки был). Насчет работы с http через сессии все верно, но если в синхронном варианте использовать request.session, то тоже будет прирост скорости, хоть и не большой
Огонь!
Но если честно я раз 20 откручивал некоторые места. Потому что в некоторых местах слишком быстро говорите, а надо было бы чуть медленнее. Есть места, которые надо прям на подкорку записать и поэтому они обязаны быть проговоренными в очень медленном темпе
Благодарю!!!!!!!
Спасибо, превосходное объяснение темы. Наконец-то стало до конца ясно, как именно работает асинхронность в питоне!
Олег, а как asyncio превращает обычную функцию в генератор? Чтобы бесконечный цикл внутри не блокировал выполнение? Или вы тут этого добивались как раз с помощью asyncio.sleep, которая превращала нашу функцию в обёртку для генератора из модуля asyncio? А ensure_future (create task) занимается инициализацией генераторов, да? И наконец не могу не спросить: а что если мы await используем вместо конструкции yield from в классическом генераторе (хочу понять: это просто синтаксический сахар или там изменилось поведение)?
В общем, ещё раз благодарю за замечательное объяснение.
Было бы логичнее завершить этот раздел использовав тот же самый пример клиент сервера, что и был в предыдущих видео.
Вопрос, к автору. Видео действительно хорошие. Но почему бы в конце плейлиста не дать ссылку на гит репозиторий?
автор не дает готовый код, (и правильно делает) предполагая, что мы должны все понять и написать своё.
дает, но за деньги
Если кто-то как и я столкнулся с ошибкой "RuntimeError: Event loop is closed" на windows, то мне помогло решение добавить перед asyncio.run(main2()) строку asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
Некоторые вещи я всё таки не пойму. К примеру почему я должен боятся функции sleep(), если они как говорит автор полностью асинхронны? И это во первых.
Во вторых хотелось бы узнать чем будет лучше использовать именно метод построения асинхронной программы из видео, чем метод с библиотекой threading? Метод threading тоже из функции делает что-то подобное или я где-то ошибаюсь? Поясните плиз.
спасибо
Смотрю вроде как понятно, потом снова смотрю и не понятно где ставятся async и await. Понял только что в обяъвление фунций ставим async, а когда вызываем await, но в остальных случаях не совсем понятно.
Олег, привет! Круто было бы сделать серию про Docker. Очень востребованная штука, а на русскоязычном ютубе про него вообще ничего полезного. Спасибо за труды!
Отличное объяснение
а вот с aiofile
```async def write_image_async(data, url):
name = os.path.join("./images_async", url.split("/")[-1])
async with AIOFile(name, 'wb') as file:
await file.write(data)
await file.fsync()
```
получается медленнее чем синхронно писать файлы
Потому что aiofile использует многопоточность, а я так понял в python это целая проблема, так как она реализуется через прослойку gil, которая призвана упростить работу с потоками. И по факту в каждый момент времени процессор выполняет только один поток. (habr.com/ru/post/149420/).
Плюс есть еще проблема с одновременной записью нескольких файлов (можно проверить так поставить на копирование очередью и одновременно нескольких, очередь выиграет, особенно если фалов много). (dmlab.ru/python-aiofiles-vs-aiofile)
Шикакрные видосы! Даже лучше чем у англоязычных коллег. (индусов не считаем ☻)
Также хотел спросить, а есть простой способ и файлы асинхронно записывать? Я ведь понимаю что file.write(data) это блокирующая операция?
В начале этого видео я об этом говорил.
Олег, спасибо за видео.
Огромная просьба выпустить видео со слушающим сервером aiohttp, внутри которого запросы с ClientSession на другой сервер.
Вопрос в двух Event Loop. Одна встроенная в aiohttp.web и другая в asyncio.
Зарание благодарю!
а нельзя вместо первой блокирующей функции использовать пользовательский ввод?
а вторая функция от этого ввода будет менять свое поведение не прекращая своей работы
Привет! Ты знаешь, как можно помирить async и Buildozer? Знаю, что ты делал приложение на python, может сталкивался с такой проблемой…
У кого код выдает ошибку Event loop is closed - это проблема с aiohttp. (и похоже только на винде). Решается добавлением одной строчки перед RUN:
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
asyncio.run(main2())
Спасибо за урок. Подскажите. Если использовать модуль multiprocessing для решения аналогичной задачи, как в конце видео, в примере с картинками? Уместно ли это? И какой результат в скорости был бы? Примерно такой же?
Если процессов будет по количеству ядер процессора, то это даст определенный прирост в скорости.
Но в общем и целом для IO-задач (а работа с сетью - это она) используются потоки.
Насколько это будет быстрее по сравнению с асинхронным решением - я не знаю. Проверьте.
Новичкам которые начинают с питона (и не знают ничего об асинхронности) лучше смотреть с 7 видео, а потом с 1 до 7 (если будет интересно).
Совсем забросили канал! Спасибо за видео. Жаль, что нет новых.
даю слово, что как устроюсь мидл прогером благодаря тебе - то обязательно озолочу ручку). спасибо большое
мне будучи джуном ничего не мешает отспыпать гроши))
@Lorem Ipsum всмысле?
@Lorem Ipsum Без развития - никуда. Но многое упирается в сферу рынка в которой ты работаешь. Например, мне приходится создатавать карты и геоинформационные ресурсы, которые требуют знания территориального устройства, знания законов, знания в сфере кадастровой и рыночной оценки и.т.д. Но это везде так, например, друг работает программистом на бирже, как в фильме волк с уолл стрит(только без шлюх и наркотиков) и ему приходится изучать тонкости этой отрасли
@Lorem Ipsum и вам
И как успехи?
афигено
с asyncio.run(main()) почему-то не работает, RuntimeError: Event loop is closed выдаёт
а вот по старинке с :
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
работает.
тоже самое было, спасибо😉
Подтверждаю. Хотя картинки скачались.
Куда копать? Хочу asyncio.run(main()) без ошибок рантайма.
@@user-ry3fx3pd5h win? вроде эта ошибка у меня была именно на винде. на линукс такой проблемы нет
Да, на win.
Проверил в Арче - всё Ок.
@@user-ry3fx3pd5h отсюда вывод, программировать под linux. какая-то проблема именно в библиотеке под win, я дотошно не изучал, или loop.run_until_complete
Олег, можете посоветовать дополнительные материалы для изучение асинхронного программирования в Python? В т.ч. по asyncio, aiohttp. Спасибо)
рекомендую видео американских авторов
нередко попадаются очень методичные и грамотные
яндекс-браузер позволяет смотреть в онлайн переводе озвучке
@Олег Молчанов:
9:05 В этих ваших словах нет ошибки?
Вы говорите, что если корутина вызывает некоторую блокирующую функцию, то она также приостанавливается, но контроль выполнения возвращается обратно в событийный цикл
Мне кажется в этих словах у вас ошибка. Дело в том, что мы и пишем асинхронный код раз из-за того, что блокирующие функции не возвращаются выполнения пока не выполнятся. Если вызвать блокирующую функцию, то возврата в событийный цикл не произойдет до тех пор пока блокирующая функция не будет выполнена и таким образом событийный зависнет.
Возможно вы хотели сказать о другой ситуации? Прошу вас пояснить
Как я понял, смысл в том, что фреймворк перед вызовом блокирующей функции отдает контроль выполнения, подобно тому как это делали мы в 4_async_gens.py через yield.
9:03 Разве если корутина вызывает блокирующую функцию - то контроль передаётся в событийный цикл? Я попробовал запустить sleep(3) в одной из корутин - все задачи "заснули". Если вызываешь в корутине await asyncio.sleep(3) - то да- другие задачи из событийного цикла продолжают свою работу. Или Олег это и называет блокирующей функцией await asyncio.sleep(3) ?
Зачем использовать декоратор, если мы используем yield from который делает функцию корутиной? И почему рядом с asyncio.sleep(1) используем yield from? Заранее спасибо.
Приветствую, подкажите в каком видео вы рассказывали про SOLID ?
Классные видео уроки, но новичкам в этом курсе мало чего будет понятно.