Страдал также как и вы в попытке перестроить свой мозг и привычку думать синхронно и вот что помогло именно мне: открываете пайчарм, пишите асинхронные примеры Олега или выдумываете свои, создаёте точку входа main и прям там сразу ставите дебаггер в паузу. А после неспешна и по шагам смотрите как, что и в какой последовательности выполняется. И сразу резко все становится понятно, а работа async/await прозрачна. Await это лишь точки в которых event loop бросает выполнение скрипта на некоторое время и бежит обслуживать следующий скрипт в очереди. И все. Как только второй скрипт спотыкается об await, event loop бежит обслуживать первого, если тот готов. И так до конца.
Не досчитался 2ух уроков: 1) Реализовать часть функционала asyncio по превращению функции в корутину 2) Дописать сервер с сокетами с async/await Но в целом серия уроков дала ОООООООЧЕНЬ сильный старт в асинхронности, думаю до этих пунктов дойду самостоятельно. Автору огромное спасибо! Даже в 22 году инфа актуальна)
Спасибо Олегу за прекрасный курс, многое приоткрылось из под ширмы. Приколько знать, как все это работает с минимальным уровнем абстракций. Автору выражаю большую благодарность за потраченное время.❤️
Олег, курс огонь, спасибо огрменное! Тем кто досмотрел до этого видео и ничего не понял сходу (как я при первом подходе): - Начать смотреть цикл видео с самого начала - Если повторять за видео,а ещё лучше - ставить на паузу и пытаться самому написать код, а потом смотреть дальше, то всё становится понятно. Я прям почувствовал, как преисполнился в познании, после того как понял механизм работы yield from (await) =) - На предыдущих видео дебажить код по строкам тоже очень полезно, особенно, если вы какие-то свои дополнительные примеры придумываете (ответить клиенту что-нибудь сразу после accept-а, например) - Если сложно - не сдавайтесь! Понимание придёт со временем =) P.S. Cправедливости ради, request на сессиях тоже работает быстрее, чем обычный get (примерно в два раза), но медленнее чем асинхронный код)
Большое спасибо. Самое лучшее объяснение асинхронности Python которое я увидел. Особенно понравилось, что объяснение началось с азов. Больше узнал и понял про функции генераторы. Последние примеры тоже огонь! С удовольствием задоначу.
Воу, какая поставленная речь, какой прекрасный гайд и не так, как другие рассказывают ни то ни сё, воду разливают, просто прекрасно. Видно, что у автора огромный опыт за плечами, однозначно лайк👍
Спустя год вернулся к этому циклу видосов. В первый раз не осознал, слишком поверхностное было понимание. Сейчас смотрел, осознавал, имплементировал все примеры самостоятельно. И вот теперь пришло понимание. Спасибо, Олег. Как всегда очень ценный контент. Надеюсь, что будешь потихоньку продолжать раскрывать непростые и нужные темы.
спустя 2 года наткнулся на этот плейлист и теперь благодаря нему разобрался во всём концепте async / await, что они из себя представляют и что такое event loop, день прошёл не зря
Потрясающе! Олег, было бы ещё очень интересно послушать от Вас про многопоточность / мультипроцессность / асинхронность, в плане где и что уместно применять. Наверняка у каждой схемы есть какие-то свои побочки на память, загрузку ЦП и т.д.
Очень, очень доходчиво. Спасибо, Олег Молчанов. Не знаю, занимаетесь ли преподаванием сейчас, но Вы, сделали очень большое и полезное дело. На мой взгляд - лучшая подача материала, которую я встречал.
На win10 столкнулся с двумя ошибками(скорее особенностями). 1. Программа заканчивается с ошибкой event loop is closed. Лечится установкой параметра asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()), перед вызовом asyncio.run(main(2)) 2. Сохраняется всего 1-2 файла. Проблема в особенности получения времени в Windows. Файлы, тупо, называются одним именем и перезаписывают друг друга. Лечится иным способом именования. По поводу курса - ОГОНЬ!!! Олег объясняет как боженька) Жаль пропал человек(((
Олег, кроме вас таких подробных руководств пока не нашел на Ютубе. Да, есть конечно курсы разные и т.д. - это отдельная всё таки вещь, там разбираюсь всё от базовых вещей, а потом разбирают на кейсах. Но ваши разборы в этом формате - очень конкурентные, спасибо. Ну и конечно: приятный голос, правильно объясняете - вам бы лекции вести :)
Олег, приветствую. Я не по теме видоса. Ты пропал. Это печально) появляйся скорее с новым видео. Если можешь снять видео про Celery или просто рассказать, как удаленно на сервере заставить питоновские скрипты работать по расписанию или по событиям- было бы очень здорово. Я знаю, что ты читаешь комментарии. Надеюсь, прочитаешь и мой. Удачи и спасибо!
Олег, большое Вам спасибо за проделанную работу. На #5 и #6 усвоение информации для меня пошло немного тяжелее, разрыв шаблонов так сказать, но к этому уроку у меня, видимо, "прогрелся кэш", и информацию впитал на ура. :D Жаль, что вы не продемонстрировали возможность работы с файловой системой не прибегая к синхронной функции... Обратил внимание, что на Вашем канале нет новых видео уже 2 года, надеюсь, что у Вас всё хорошо! Очень понравилась ваша внимательность к деталям и в целом подача материала, Вы замечательный педагог. Возможно, в дальнейшем (по необходимости) ознакомлюсь с другими плейлистами с Вашего канала. Всех благ, очень благодарен!
Настало время начать использовать асинхронный код, но вот провести соплями по реальному примеру некому. Сама суть ясная была еще на вводных курсах, но внятный вариант реализации только твой ) Очень хороший пример на основе aiohttp. Сама либа не сложная (тот же реквест только асинхронный), но вот не зная о ее существовании я бы бился с requests и ничего бы не добился ))) Спасибо тебе большое!
Для тех, у кого зависает асинхронная загрузка. Скорее всего это не баг в коде, а блокировка со стороны сервера. Попробуйте воспользоваться другим котогенератором.
Огонь! Но если честно я раз 20 откручивал некоторые места. Потому что в некоторых местах слишком быстро говорите, а надо было бы чуть медленнее. Есть места, которые надо прям на подкорку записать и поэтому они обязаны быть проговоренными в очень медленном темпе
Если честно, пока сам не начал играться с асинхронность - все объяснения как об стенку горох. Сделал на grequests + asyncio быстрый асинхронный парсер заголовков страниц (в качестве теста). Сравнил с тем же решением на обычных реквестах и многопроцессорности - реально быстрее получается на асинхроне прогрузить пачку страниц. Если кому интересно, могу показать код.
Классно объясняешь, но не слова про async for, этим можно было бы еще упростить код в последнем примере (допускаю, что в 2018 его могло еще не быть, но вроде все-таки был). Насчет работы с http через сессии все верно, но если в синхронном варианте использовать request.session, то тоже будет прирост скорости, хоть и не большой
@@temamart-k Я канал начал смотреть именно с этого видео, потому как мне надо было разобраться именно с asyncio, посмотрел еще другие видео, не по теме асинхронности. Мне нужно было разобраться в вопросе - я нашел объяснение. А уж всей темой в целом я ознакомлюсь как-нибудь потом.
Спасибо огромное вам! Жаль что это всё что я могу сделать) Не представляю где бы я брал эту инфу. В жизни бы не подумал что асинхронность основана на генераторах
Долго не мог понять как все-таки устроена функция await, когда хотел именно использовать синхронные методы (вместо aiohttp), но эта статья окончатель все пояснила: habr.com/ru/post/453348/ P.S. благодаря предыдущим видео разобрался легко в статье.
Спасибо, превосходное объяснение темы. Наконец-то стало до конца ясно, как именно работает асинхронность в питоне! Олег, а как asyncio превращает обычную функцию в генератор? Чтобы бесконечный цикл внутри не блокировал выполнение? Или вы тут этого добивались как раз с помощью asyncio.sleep, которая превращала нашу функцию в обёртку для генератора из модуля asyncio? А ensure_future (create task) занимается инициализацией генераторов, да? И наконец не могу не спросить: а что если мы await используем вместо конструкции yield from в классическом генераторе (хочу понять: это просто синтаксический сахар или там изменилось поведение)? В общем, ещё раз благодарю за замечательное объяснение.
Олег, спасибо за видео. Огромная просьба выпустить видео со слушающим сервером aiohttp, внутри которого запросы с ClientSession на другой сервер. Вопрос в двух Event Loop. Одна встроенная в aiohttp.web и другая в asyncio. Зарание благодарю!
Олег, ну вы серьезно считерили в своем сравнении синхронной и асинхронной загрузки картинок. Вы получили около 12 сек при синхронной загрузке, и около одной сек при асинхронной. Вот только в первом случае вы не использовали сессию, а во втором использовали! Выглядит все так, как будто производительность увеличилась в 12 раз из-за асинхронности. На самом же деле эксперимент не чистый. Проверил у себя, получил такие цифры: без сохранения сессии на 10 запросов уходит 2-3 сек если запрашивать в рамках одной сессии ~1,5 сек asyncio + session - около 1 сек. А вообще спасибо, вас приятно смотреть, все грамотно, чувствуется хорошее понимание.
@@Das.Kleine.Krokodil В том что с использованием Session при направлении запроса к хосту у вас не будет устанавливаться новое соединение, а будет переиспользовано старое. Соответственно экономится время. И по моим замерам на моих примерах получилось, что именно это в первую очередь дало прирост скорости, а уже во вторую асинхронность.
@Олег Молчанов: 9:05 В этих ваших словах нет ошибки? Вы говорите, что если корутина вызывает некоторую блокирующую функцию, то она также приостанавливается, но контроль выполнения возвращается обратно в событийный цикл Мне кажется в этих словах у вас ошибка. Дело в том, что мы и пишем асинхронный код раз из-за того, что блокирующие функции не возвращаются выполнения пока не выполнятся. Если вызвать блокирующую функцию, то возврата в событийный цикл не произойдет до тех пор пока блокирующая функция не будет выполнена и таким образом событийный зависнет. Возможно вы хотели сказать о другой ситуации? Прошу вас пояснить
Как я понял, смысл в том, что фреймворк перед вызовом блокирующей функции отдает контроль выполнения, подобно тому как это делали мы в 4_async_gens.py через yield.
Спасибо за урок. Подскажите. Если использовать модуль multiprocessing для решения аналогичной задачи, как в конце видео, в примере с картинками? Уместно ли это? И какой результат в скорости был бы? Примерно такой же?
Если процессов будет по количеству ядер процессора, то это даст определенный прирост в скорости. Но в общем и целом для IO-задач (а работа с сетью - это она) используются потоки. Насколько это будет быстрее по сравнению с асинхронным решением - я не знаю. Проверьте.
Шикакрные видосы! Даже лучше чем у англоязычных коллег. (индусов не считаем ☻) Также хотел спросить, а есть простой способ и файлы асинхронно записывать? Я ведь понимаю что file.write(data) это блокирующая операция?
У кого код выдает ошибку Event loop is closed - это проблема с aiohttp. (и похоже только на винде). Решается добавлением одной строчки перед RUN: asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) asyncio.run(main2())
Отличное объяснение а вот с 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)
Смотрю вроде как понятно, потом снова смотрю и не понятно где ставятся async и await. Понял только что в обяъвление фунций ставим async, а когда вызываем await, но в остальных случаях не совсем понятно.
Олег, привет! Круто было бы сделать серию про Docker. Очень востребованная штука, а на русскоязычном ютубе про него вообще ничего полезного. Спасибо за труды!
Некоторые вещи я всё таки не пойму. К примеру почему я должен боятся функции sleep(), если они как говорит автор полностью асинхронны? И это во первых. Во вторых хотелось бы узнать чем будет лучше использовать именно метод построения асинхронной программы из видео, чем метод с библиотекой threading? Метод threading тоже из функции делает что-то подобное или я где-то ошибаюсь? Поясните плиз.
9:03 Разве если корутина вызывает блокирующую функцию - то контроль передаётся в событийный цикл? Я попробовал запустить sleep(3) в одной из корутин - все задачи "заснули". Если вызываешь в корутине await asyncio.sleep(3) - то да- другие задачи из событийного цикла продолжают свою работу. Или Олег это и называет блокирующей функцией await asyncio.sleep(3) ?
@Lorem Ipsum Без развития - никуда. Но многое упирается в сферу рынка в которой ты работаешь. Например, мне приходится создатавать карты и геоинформационные ресурсы, которые требуют знания территориального устройства, знания законов, знания в сфере кадастровой и рыночной оценки и.т.д. Но это везде так, например, друг работает программистом на бирже, как в фильме волк с уолл стрит(только без шлюх и наркотиков) и ему приходится изучать тонкости этой отрасли
Зачем использовать декоратор, если мы используем yield from который делает функцию корутиной? И почему рядом с asyncio.sleep(1) используем yield from? Заранее спасибо.
Здравствуйте, спасибо за видео! Расскажите, пожалуйста, что лучше использовать для скорости (например, обработки веб-сокетов) асинхронное программирование или потоки (модуль threading)? Заранее спасиьо
Хоть и поздно, но отвечу сервер Apache использует многопоточность, а nginx ассинхронные сокеты. Nginx сейчас всех делает по производительности. Так что выбор в этом плане очевиден.
а нельзя вместо первой блокирующей функции использовать пользовательский ввод? а вторая функция от этого ввода будет менять свое поведение не прекращая своей работы
19:00 - не понимаю, зачем нам эти декораторы? Чтобы сделать корутины? Разве наши ф-ции не становятся ими автоматически при ```yield from```? Я запутался
Аналогичный вопрос возник и у меня. Если 6 уроков до этого разжёвывают всё до мелких деталей, плюс также в предыдущем уроке показывают пример декоратора корутины для первой инициализации. То здесь этот момент упущен. Классическое "сам пройди и посмотри, что там внутри" - ну ок, пройдем и посмотрим.
Страдал также как и вы в попытке перестроить свой мозг и привычку думать синхронно и вот что помогло именно мне: открываете пайчарм, пишите асинхронные примеры Олега или выдумываете свои, создаёте точку входа 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 (примерно в два раза), но медленнее чем асинхронный код)
Спасибо. Олег Молчанов это лучшее что есть по питону в русском ютубе.
Большое спасибо. Самое лучшее объяснение асинхронности Python которое я увидел. Особенно понравилось, что объяснение началось с азов. Больше узнал и понял про функции генераторы. Последние примеры тоже огонь! С удовольствием задоначу.
Воу, какая поставленная речь, какой прекрасный гайд и не так, как другие рассказывают ни то ни сё, воду разливают, просто прекрасно. Видно, что у автора огромный опыт за плечами, однозначно лайк👍
Спустя год вернулся к этому циклу видосов. В первый раз не осознал, слишком поверхностное было понимание. Сейчас смотрел, осознавал, имплементировал все примеры самостоятельно. И вот теперь пришло понимание. Спасибо, Олег. Как всегда очень ценный контент. Надеюсь, что будешь потихоньку продолжать раскрывать непростые и нужные темы.
спустя 2 года наткнулся на этот плейлист и теперь благодаря нему разобрался во всём концепте async / await, что они из себя представляют и что такое event loop, день прошёл не зря
Потрясающе! Олег, было бы ещё очень интересно послушать от Вас про многопоточность / мультипроцессность / асинхронность, в плане где и что уместно применять. Наверняка у каждой схемы есть какие-то свои побочки на память, загрузку ЦП и т.д.
Крутой курс по базе асинк, Спасибо!
Очень, очень доходчиво. Спасибо, Олег Молчанов. Не знаю, занимаетесь ли преподаванием сейчас, но Вы, сделали очень большое и полезное дело. На мой взгляд - лучшая подача материала, которую я встречал.
Олег, спасибо за еще одну прекрасную серию!
В будущем интересно было бы послушать вас про функциональное программирование на python
Олег, огромное вам спасибо. Как только устроюсь - обязательно с первой зп скину донат! Очень крутые уроки!
Невозможно поверить, что может существовать настолько качественный контент)))
Одно из полезнейших видео, просмотренных мной в жизни
Огромное спасибо вам, за ценный урок!
На win10 столкнулся с двумя ошибками(скорее особенностями).
1. Программа заканчивается с ошибкой event loop is closed. Лечится установкой параметра asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()), перед вызовом asyncio.run(main(2))
2. Сохраняется всего 1-2 файла. Проблема в особенности получения времени в Windows. Файлы, тупо, называются одним именем и перезаписывают друг друга. Лечится иным способом именования.
По поводу курса - ОГОНЬ!!! Олег объясняет как боженька) Жаль пропал человек(((
Отличный цикл видео. Спасибо огромное.
Сначала на одном дыхании посмотрел всю серию, потом вернулся и на всех лайки поставил :)
Олег, кроме вас таких подробных руководств пока не нашел на Ютубе.
Да, есть конечно курсы разные и т.д. - это отдельная всё таки вещь, там разбираюсь всё от базовых вещей, а потом разбирают на кейсах.
Но ваши разборы в этом формате - очень конкурентные, спасибо.
Ну и конечно: приятный голос, правильно объясняете - вам бы лекции вести :)
Спасибо
@Animus Pexus Не осилил?) Нормальный это ассемблер?
@Animus Pexus Чисто из любопытства) Какие всё же языки вы считаете нормальными и почему? В палемику вступать не собираюсь, просто интересно))
@Animus Pexus Дружище, просто шутка, не хотел обидеть))
@Animus Pexus Go крутой, да?
Огромное спасибо. Появилось понимание async
Спасибо. Очень хорошо объясняете. Приятно учиться и все понятно!
Ты просто лучший, спасибо ОГРОМНОЕ!
Это просто что-то невероятное
Спасибо, Олег!
В 5 утра записывать видосы по асинхронности :) большой риспект вам
Отличные, замечательные уроки. Олег, спасибо за ваш труд. Очень полезный контент.
Большое спасибо за эту отличную серию видеоуроков!
00:00 Описание библиотеки Asyncio
10:32 Пример: асинхронный вывод чисел и счетчика
24:59 Пример: асинхронная скачка картинок из интернета
Большое спасибо за курс!
Спасибо большое. Не пишу на Python но вьінужден его читать)) Интересньій язьік, спасибо за об'ьяснения
Спасибо вам Олег
Спасибо. Понравилось. Стало яснее.
Отличные уроки! Спасибо большое!
Олег, приветствую. Я не по теме видоса. Ты пропал. Это печально) появляйся скорее с новым видео. Если можешь снять видео про Celery или просто рассказать, как удаленно на сервере заставить питоновские скрипты работать по расписанию или по событиям- было бы очень здорово. Я знаю, что ты читаешь комментарии. Надеюсь, прочитаешь и мой. Удачи и спасибо!
MrYoklmn где Олег? Что случилось как так
celery было бы хорошим продолжением серии по django и asyncio
Спасибо большое за видео, отличные!
Спасибо за отличный урок
Олег, большое Вам спасибо за проделанную работу. На #5 и #6 усвоение информации для меня пошло немного тяжелее, разрыв шаблонов так сказать, но к этому уроку у меня, видимо, "прогрелся кэш", и информацию впитал на ура. :D Жаль, что вы не продемонстрировали возможность работы с файловой системой не прибегая к синхронной функции... Обратил внимание, что на Вашем канале нет новых видео уже 2 года, надеюсь, что у Вас всё хорошо! Очень понравилась ваша внимательность к деталям и в целом подача материала, Вы замечательный педагог. Возможно, в дальнейшем (по необходимости) ознакомлюсь с другими плейлистами с Вашего канала. Всех благ, очень благодарен!
Посмотрел все 7 вдосиков, задонатил, теперь буду переваривать инфу, прояснилось многое, но кое-какие вещи надо ещё переварить и понять.
спасибо, божественно
Огромное спасибо за данное видео, очень много материала в интернете с неприменимыми к жизни примерами, благодаря вам наконец смог использовать asyncio
Олег, спасибо большое за серию этих видео.
Автору огромный респект)
Спасибо за уроки. Ждем следующих. Очень познавательно.
Спасибо. Тяжело дается :)))))))
Большое спасибо за туториалы!
Олег, спасибо за полезные знания, задонатил.
Настало время начать использовать асинхронный код, но вот провести соплями по реальному примеру некому.
Сама суть ясная была еще на вводных курсах, но внятный вариант реализации только твой )
Очень хороший пример на основе aiohttp. Сама либа не сложная (тот же реквест только асинхронный), но вот не зная о ее существовании я бы бился с requests и ничего бы не добился )))
Спасибо тебе большое!
Жду 8 и 9 часть. Спасибо за видео!
Топовый контент по asyncio в русском ютубе.
большое спасибо за серию видео. очень позновательно
Очень круто, спасибо большое за курс, но где же реализация примера из первого видео на async await?)
Очень годный контент, спасибо за него. Продолжай в том же духе! Донаты будут!)
спасибо огромное этому человеку!
Потрясающая серия роликов, спасибо!
спасибо из 24 года)
Для тех, у кого зависает асинхронная загрузка. Скорее всего это не баг в коде, а блокировка со стороны сервера. Попробуйте воспользоваться другим котогенератором.
честь и хвала. спасибо!
Огонь!
Но если честно я раз 20 откручивал некоторые места. Потому что в некоторых местах слишком быстро говорите, а надо было бы чуть медленнее. Есть места, которые надо прям на подкорку записать и поэтому они обязаны быть проговоренными в очень медленном темпе
Если честно, пока сам не начал играться с асинхронность - все объяснения как об стенку горох. Сделал на grequests + asyncio быстрый асинхронный парсер заголовков страниц (в качестве теста). Сравнил с тем же решением на обычных реквестах и многопроцессорности - реально быстрее получается на асинхроне прогрузить пачку страниц.
Если кому интересно, могу показать код.
Интересно, покажите!
Макс привет
Супер🤟
как всегда. Хорошая работа, Олег
Классно объясняешь, но не слова про async for, этим можно было бы еще упростить код в последнем примере (допускаю, что в 2018 его могло еще не быть, но вроде все-таки был). Насчет работы с http через сессии все верно, но если в синхронном варианте использовать request.session, то тоже будет прирост скорости, хоть и не большой
Класс! Спасибо большое!
Начинало смотреть 22к людей, закончило - 11к. вывод - либо половина умерла от асинхронки, либо она им просто не зашла)
это еще отличный результат, обычно какие-то курсы - первый урок 35к, второй - 20к, десятый - 1.5к)
Либо кто-то нашел для себя решение и не стал смотреть все остальное.
Amarok ты внимательно смотрел курс?
@@temamart-k Я канал начал смотреть именно с этого видео, потому как мне надо было разобраться именно с asyncio, посмотрел еще другие видео, не по теме асинхронности. Мне нужно было разобраться в вопросе - я нашел объяснение. А уж всей темой в целом я ознакомлюсь как-нибудь потом.
@Sensei - Says Да, спасибо, что переживали за меня все это время.
Спасибо огромное вам! Жаль что это всё что я могу сделать) Не представляю где бы я брал эту инфу. В жизни бы не подумал что асинхронность основана на генераторах
Огонь!
Шикарно
Долго не мог понять как все-таки устроена функция await, когда хотел именно использовать синхронные методы (вместо aiohttp), но эта статья окончатель все пояснила: habr.com/ru/post/453348/
P.S. благодаря предыдущим видео разобрался легко в статье.
Спасибо, превосходное объяснение темы. Наконец-то стало до конца ясно, как именно работает асинхронность в питоне!
Олег, а как asyncio превращает обычную функцию в генератор? Чтобы бесконечный цикл внутри не блокировал выполнение? Или вы тут этого добивались как раз с помощью asyncio.sleep, которая превращала нашу функцию в обёртку для генератора из модуля asyncio? А ensure_future (create task) занимается инициализацией генераторов, да? И наконец не могу не спросить: а что если мы await используем вместо конструкции yield from в классическом генераторе (хочу понять: это просто синтаксический сахар или там изменилось поведение)?
В общем, ещё раз благодарю за замечательное объяснение.
Олег, спасибо за видео.
Огромная просьба выпустить видео со слушающим сервером aiohttp, внутри которого запросы с ClientSession на другой сервер.
Вопрос в двух Event Loop. Одна встроенная в aiohttp.web и другая в asyncio.
Зарание благодарю!
Спасибо, Олег!
Вопрос, к автору. Видео действительно хорошие. Но почему бы в конце плейлиста не дать ссылку на гит репозиторий?
автор не дает готовый код, (и правильно делает) предполагая, что мы должны все понять и написать своё.
дает, но за деньги
Олег, ну вы серьезно считерили в своем сравнении синхронной и асинхронной загрузки картинок. Вы получили около 12 сек при синхронной загрузке, и около одной сек при асинхронной. Вот только в первом случае вы не использовали сессию, а во втором использовали! Выглядит все так, как будто производительность увеличилась в 12 раз из-за асинхронности. На самом же деле эксперимент не чистый.
Проверил у себя, получил такие цифры:
без сохранения сессии на 10 запросов уходит 2-3 сек
если запрашивать в рамках одной сессии ~1,5 сек
asyncio + session - около 1 сек.
А вообще спасибо, вас приятно смотреть, все грамотно, чувствуется хорошее понимание.
и в чем причина этого?
@@Das.Kleine.Krokodil В том что с использованием Session при направлении запроса к хосту у вас не будет устанавливаться новое соединение, а будет переиспользовано старое. Соответственно экономится время.
И по моим замерам на моих примерах получилось, что именно это в первую очередь дало прирост скорости, а уже во вторую асинхронность.
@@dv-key спасибо
Благодарю!!!!!!!
Совсем забросили канал! Спасибо за видео. Жаль, что нет новых.
@Олег Молчанов:
9:05 В этих ваших словах нет ошибки?
Вы говорите, что если корутина вызывает некоторую блокирующую функцию, то она также приостанавливается, но контроль выполнения возвращается обратно в событийный цикл
Мне кажется в этих словах у вас ошибка. Дело в том, что мы и пишем асинхронный код раз из-за того, что блокирующие функции не возвращаются выполнения пока не выполнятся. Если вызвать блокирующую функцию, то возврата в событийный цикл не произойдет до тех пор пока блокирующая функция не будет выполнена и таким образом событийный зависнет.
Возможно вы хотели сказать о другой ситуации? Прошу вас пояснить
Как я понял, смысл в том, что фреймворк перед вызовом блокирующей функции отдает контроль выполнения, подобно тому как это делали мы в 4_async_gens.py через yield.
Спасибо за урок. Подскажите. Если использовать модуль multiprocessing для решения аналогичной задачи, как в конце видео, в примере с картинками? Уместно ли это? И какой результат в скорости был бы? Примерно такой же?
Если процессов будет по количеству ядер процессора, то это даст определенный прирост в скорости.
Но в общем и целом для IO-задач (а работа с сетью - это она) используются потоки.
Насколько это будет быстрее по сравнению с асинхронным решением - я не знаю. Проверьте.
Было бы логичнее завершить этот раздел использовав тот же самый пример клиент сервера, что и был в предыдущих видео.
Шикакрные видосы! Даже лучше чем у англоязычных коллег. (индусов не считаем ☻)
Также хотел спросить, а есть простой способ и файлы асинхронно записывать? Я ведь понимаю что file.write(data) это блокирующая операция?
В начале этого видео я об этом говорил.
У кого код выдает ошибку Event loop is closed - это проблема с aiohttp. (и похоже только на винде). Решается добавлением одной строчки перед RUN:
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
asyncio.run(main2())
Отличное объяснение
а вот с 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)
Сотни лайков!!!! ❤❤❤
Смотрю вроде как понятно, потом снова смотрю и не понятно где ставятся async и await. Понял только что в обяъвление фунций ставим async, а когда вызываем await, но в остальных случаях не совсем понятно.
Олег, привет! Круто было бы сделать серию про Docker. Очень востребованная штука, а на русскоязычном ютубе про него вообще ничего полезного. Спасибо за труды!
Олег, можете посоветовать дополнительные материалы для изучение асинхронного программирования в Python? В т.ч. по asyncio, aiohttp. Спасибо)
рекомендую видео американских авторов
нередко попадаются очень методичные и грамотные
яндекс-браузер позволяет смотреть в онлайн переводе озвучке
Некоторые вещи я всё таки не пойму. К примеру почему я должен боятся функции sleep(), если они как говорит автор полностью асинхронны? И это во первых.
Во вторых хотелось бы узнать чем будет лучше использовать именно метод построения асинхронной программы из видео, чем метод с библиотекой threading? Метод threading тоже из функции делает что-то подобное или я где-то ошибаюсь? Поясните плиз.
только сейчас в пайтон 3.11 полностью убрали декоратор asyncio.coroutine, долго прожил.
Мм.. спасибо, то то думаю чего ругается
9:03 Разве если корутина вызывает блокирующую функцию - то контроль передаётся в событийный цикл? Я попробовал запустить sleep(3) в одной из корутин - все задачи "заснули". Если вызываешь в корутине await asyncio.sleep(3) - то да- другие задачи из событийного цикла продолжают свою работу. Или Олег это и называет блокирующей функцией await asyncio.sleep(3) ?
даю слово, что как устроюсь мидл прогером благодаря тебе - то обязательно озолочу ручку). спасибо большое
мне будучи джуном ничего не мешает отспыпать гроши))
@Lorem Ipsum всмысле?
@Lorem Ipsum Без развития - никуда. Но многое упирается в сферу рынка в которой ты работаешь. Например, мне приходится создатавать карты и геоинформационные ресурсы, которые требуют знания территориального устройства, знания законов, знания в сфере кадастровой и рыночной оценки и.т.д. Но это везде так, например, друг работает программистом на бирже, как в фильме волк с уолл стрит(только без шлюх и наркотиков) и ему приходится изучать тонкости этой отрасли
@Lorem Ipsum и вам
И как успехи?
Приветствую, подкажите в каком видео вы рассказывали про SOLID ?
Зачем использовать декоратор, если мы используем yield from который делает функцию корутиной? И почему рядом с asyncio.sleep(1) используем yield from? Заранее спасибо.
Привет! Ты знаешь, как можно помирить async и Buildozer? Знаю, что ты делал приложение на python, может сталкивался с такой проблемой…
Здравствуйте, спасибо за видео! Расскажите, пожалуйста, что лучше использовать для скорости (например, обработки веб-сокетов) асинхронное программирование или потоки (модуль threading)? Заранее спасиьо
Хоть и поздно, но отвечу сервер Apache использует многопоточность, а nginx ассинхронные сокеты. Nginx сейчас всех делает по производительности. Так что выбор в этом плане очевиден.
а нельзя вместо первой блокирующей функции использовать пользовательский ввод?
а вторая функция от этого ввода будет менять свое поведение не прекращая своей работы
19:00 - не понимаю, зачем нам эти декораторы? Чтобы сделать корутины? Разве наши ф-ции не становятся ими автоматически при ```yield from```? Я запутался
а вы посмотрите что там внутри декораторов, в самой библиотеке
Аналогичный вопрос возник и у меня. Если 6 уроков до этого разжёвывают всё до мелких деталей, плюс также в предыдущем уроке показывают пример декоратора корутины для первой инициализации. То здесь этот момент упущен. Классическое "сам пройди и посмотри, что там внутри" - ну ок, пройдем и посмотрим.
про aiohttp уроки не планируете
Классные видео уроки, но новичкам в этом курсе мало чего будет понятно.
Привет. А можно получить твой полный конфиг Atom? От стилей, до пакетов. Было бы удобно загрузить его с какого-нибудь Гитхаба
Зачем? Настройте его под себя - как вам нравится.
@@zaemiel так скил вырастет моментально =))) Это как покупка фотоаппарата проф.уровня =)))