Страдал также как и вы в попытке перестроить свой мозг и привычку думать синхронно и вот что помогло именно мне: открываете пайчарм, пишите асинхронные примеры Олега или выдумываете свои, создаёте точку входа main и прям там сразу ставите дебаггер в паузу. А после неспешна и по шагам смотрите как, что и в какой последовательности выполняется. И сразу резко все становится понятно, а работа async/await прозрачна. Await это лишь точки в которых event loop бросает выполнение скрипта на некоторое время и бежит обслуживать следующий скрипт в очереди. И все. Как только второй скрипт спотыкается об await, event loop бежит обслуживать первого, если тот готов. И так до конца.
@igorkulibaba72876 жыл бұрын
Как же классно Олег объясняешь! От души доначу знаю что помощь твоя не оценима. Спасибо
@sergeyshevtsov51254 жыл бұрын
Спустя год вернулся к этому циклу видосов. В первый раз не осознал, слишком поверхностное было понимание. Сейчас смотрел, осознавал, имплементировал все примеры самостоятельно. И вот теперь пришло понимание. Спасибо, Олег. Как всегда очень ценный контент. Надеюсь, что будешь потихоньку продолжать раскрывать непростые и нужные темы.
@vlad_gnom7 ай бұрын
Спасибо Олегу за прекрасный курс, многое приоткрылось из под ширмы. Приколько знать, как все это работает с минимальным уровнем абстракций. Автору выражаю большую благодарность за потраченное время.❤️
@bip-bip-tip10 ай бұрын
Олег, курс огонь, спасибо огрменное! Тем кто досмотрел до этого видео и ничего не понял сходу (как я при первом подходе): - Начать смотреть цикл видео с самого начала - Если повторять за видео,а ещё лучше - ставить на паузу и пытаться самому написать код, а потом смотреть дальше, то всё становится понятно. Я прям почувствовал, как преисполнился в познании, после того как понял механизм работы yield from (await) =) - На предыдущих видео дебажить код по строкам тоже очень полезно, особенно, если вы какие-то свои дополнительные примеры придумываете (ответить клиенту что-нибудь сразу после accept-а, например) - Если сложно - не сдавайтесь! Понимание придёт со временем =) P.S. Cправедливости ради, request на сессиях тоже работает быстрее, чем обычный get (примерно в два раза), но медленнее чем асинхронный код)
@peskovdev2 жыл бұрын
Не досчитался 2ух уроков: 1) Реализовать часть функционала asyncio по превращению функции в корутину 2) Дописать сервер с сокетами с async/await Но в целом серия уроков дала ОООООООЧЕНЬ сильный старт в асинхронности, думаю до этих пунктов дойду самостоятельно. Автору огромное спасибо! Даже в 22 году инфа актуальна)
@Biongar2 жыл бұрын
Да, я тоже заметил что сервер с async/await так и не написан, а жаль, пример был бы очень хороший
@МаратАхметзянов-э5ч29 күн бұрын
Псевдо asyncio без обработки ошибок: import socket from select import select def async_accept(server: socket.socket): yield "read", server return server.accept()[0] def async_recv(client: socket.socket, bufsize=1024): yield "read", client return client.recv(bufsize) def async_send(client: socket.socket, data): yield "write", client return client.send(data) def create_task(gen): if not hasattr(event_loop, "tasks"): event_loop.tasks = [] event_loop.tasks.append(gen) def async_server(): HOST = "localhost" PORT = 5555 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind((HOST, PORT)) server_socket.listen() print(f"Server listening on {HOST}:{PORT}") with server_socket: while True: conn = yield from async_accept(server_socket) # await print(f"Accepted connection from {conn.getpeername()}") create_task(async_client(conn)) # concurrent task def async_client(client: socket.socket): with client: while True: data = yield from async_recv(client, 1024) # await if not data: print(f"Client {client.getpeername()} disconnected") break print(f"Received data from {client.getpeername()}: {data.decode()}") sended = yield from async_send(client, data) # await print(f"Sent data to {client.getpeername()}: {data.decode()}") def event_loop(): if not hasattr(event_loop, "tasks"): event_loop.tasks = [] tasks = event_loop.tasks to_read = {} to_write = {} while any([tasks, to_read, to_write]): while not tasks: ready_to_read, ready_to_write, _ = select(to_read, to_write, [], 1) for sock in ready_to_read: tasks.append(to_read.pop(sock)) for sock in ready_to_write: tasks.append(to_write.pop(sock)) try: task = tasks.pop(0) action, sock = next(task) if action == "read": to_read[sock] = task elif action == "write": to_write[sock] = task except: pass print("Event loop finished") if __name__ == "__main__": create_task(async_server()) event_loop()
@trankov4 жыл бұрын
Господи, как же обалденно. Хочу, чтобы все учебники по Питону были такими.
@figaro24406 жыл бұрын
Спасибо. Олег Молчанов это лучшее что есть по питону в русском ютубе.
@АлександрБойко-у3ы2 жыл бұрын
Большое спасибо. Самое лучшее объяснение асинхронности Python которое я увидел. Особенно понравилось, что объяснение началось с азов. Больше узнал и понял про функции генераторы. Последние примеры тоже огонь! С удовольствием задоначу.
@yodapunishes5 жыл бұрын
Потрясающе! Олег, было бы ещё очень интересно послушать от Вас про многопоточность / мультипроцессность / асинхронность, в плане где и что уместно применять. Наверняка у каждой схемы есть какие-то свои побочки на память, загрузку ЦП и т.д.
@suzuyah4 жыл бұрын
спустя 2 года наткнулся на этот плейлист и теперь благодаря нему разобрался во всём концепте async / await, что они из себя представляют и что такое event loop, день прошёл не зря
@antistress_pro2 жыл бұрын
Очень, очень доходчиво. Спасибо, Олег Молчанов. Не знаю, занимаетесь ли преподаванием сейчас, но Вы, сделали очень большое и полезное дело. На мой взгляд - лучшая подача материала, которую я встречал.
@at1set5907 ай бұрын
Воу, какая поставленная речь, какой прекрасный гайд и не так, как другие рассказывают ни то ни сё, воду разливают, просто прекрасно. Видно, что у автора огромный опыт за плечами, однозначно лайк👍
@Overlap_ed3 жыл бұрын
Олег, огромное вам спасибо. Как только устроюсь - обязательно с первой зп скину донат! Очень крутые уроки!
@benyomin946 жыл бұрын
Олег, спасибо за еще одну прекрасную серию! В будущем интересно было бы послушать вас про функциональное программирование на python
@do_not_put_login_in_alias2 жыл бұрын
Отличный цикл видео. Спасибо огромное. Сначала на одном дыхании посмотрел всю серию, потом вернулся и на всех лайки поставил :)
@it_is_muchomor2 жыл бұрын
На win10 столкнулся с двумя ошибками(скорее особенностями). 1. Программа заканчивается с ошибкой event loop is closed. Лечится установкой параметра asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()), перед вызовом asyncio.run(main(2)) 2. Сохраняется всего 1-2 файла. Проблема в особенности получения времени в Windows. Файлы, тупо, называются одним именем и перезаписывают друг друга. Лечится иным способом именования. По поводу курса - ОГОНЬ!!! Олег объясняет как боженька) Жаль пропал человек(((
@ЕрвандАгаджанян-в3к3 жыл бұрын
Невозможно поверить, что может существовать настолько качественный контент)))
@darkmatiz6 жыл бұрын
Олег, кроме вас таких подробных руководств пока не нашел на Ютубе. Да, есть конечно курсы разные и т.д. - это отдельная всё таки вещь, там разбираюсь всё от базовых вещей, а потом разбирают на кейсах. Но ваши разборы в этом формате - очень конкурентные, спасибо. Ну и конечно: приятный голос, правильно объясняете - вам бы лекции вести :)
@zaemiel6 жыл бұрын
Спасибо
@FrolovDaniil4 жыл бұрын
@Animus Pexus Не осилил?) Нормальный это ассемблер?
@FrolovDaniil4 жыл бұрын
@Animus Pexus Чисто из любопытства) Какие всё же языки вы считаете нормальными и почему? В палемику вступать не собираюсь, просто интересно))
@FrolovDaniil4 жыл бұрын
@Animus Pexus Дружище, просто шутка, не хотел обидеть))
@acerswift43864 жыл бұрын
@Animus Pexus Go крутой, да?
@TheEBPO4 ай бұрын
Крутой курс по базе асинк, Спасибо!
@leomysky3 жыл бұрын
Это просто что-то невероятное Спасибо, Олег!
@nonpiramid3 жыл бұрын
Одно из полезнейших видео, просмотренных мной в жизни
@alexseydugin81094 жыл бұрын
В 5 утра записывать видосы по асинхронности :) большой риспект вам
@TheMurodilla9 ай бұрын
Огромное спасибо вам, за ценный урок!
@raferi2 жыл бұрын
Отличные, замечательные уроки. Олег, спасибо за ваш труд. Очень полезный контент.
@Das.Kleine.Krokodil3 жыл бұрын
00:00 Описание библиотеки Asyncio 10:32 Пример: асинхронный вывод чисел и счетчика 24:59 Пример: асинхронная скачка картинок из интернета
@pushkars96003 жыл бұрын
Ты просто лучший, спасибо ОГРОМНОЕ!
@Michael2010784 жыл бұрын
Спасибо. Очень хорошо объясняете. Приятно учиться и все понятно!
@vladimirpa1773 жыл бұрын
Огромное спасибо. Появилось понимание async
@АлекОним5 жыл бұрын
Большое спасибо за эту отличную серию видеоуроков!
@eq7163 жыл бұрын
Спасибо большое. Не пишу на Python но вьінужден его читать)) Интересньій язьік, спасибо за об'ьяснения
@OlesSmaha2 жыл бұрын
Олег, большое Вам спасибо за проделанную работу. На #5 и #6 усвоение информации для меня пошло немного тяжелее, разрыв шаблонов так сказать, но к этому уроку у меня, видимо, "прогрелся кэш", и информацию впитал на ура. :D Жаль, что вы не продемонстрировали возможность работы с файловой системой не прибегая к синхронной функции... Обратил внимание, что на Вашем канале нет новых видео уже 2 года, надеюсь, что у Вас всё хорошо! Очень понравилась ваша внимательность к деталям и в целом подача материала, Вы замечательный педагог. Возможно, в дальнейшем (по необходимости) ознакомлюсь с другими плейлистами с Вашего канала. Всех благ, очень благодарен!
@rlxinc.60162 жыл бұрын
Большое спасибо за курс!
@джонимантос5 жыл бұрын
Огромное спасибо за данное видео, очень много материала в интернете с неприменимыми к жизни примерами, благодаря вам наконец смог использовать asyncio
@mishkasensei4 жыл бұрын
Посмотрел все 7 вдосиков, задонатил, теперь буду переваривать инфу, прояснилось многое, но кое-какие вещи надо ещё переварить и понять.
@andredru4278 Жыл бұрын
Спасибо. Понравилось. Стало яснее.
@ikrugloff5 жыл бұрын
Олег, спасибо большое за серию этих видео.
@artur.tokranov Жыл бұрын
Отличные уроки! Спасибо большое!
@Иван-о1ш9ц Жыл бұрын
Спасибо большое за видео, отличные!
@ShadowStormlq5mwdasd Жыл бұрын
Спасибо вам Олег
@guitar_hedonist3 жыл бұрын
Настало время начать использовать асинхронный код, но вот провести соплями по реальному примеру некому. Сама суть ясная была еще на вводных курсах, но внятный вариант реализации только твой ) Очень хороший пример на основе aiohttp. Сама либа не сложная (тот же реквест только асинхронный), но вот не зная о ее существовании я бы бился с requests и ничего бы не добился ))) Спасибо тебе большое!
@aidarfachrutdinov6 жыл бұрын
Спасибо за уроки. Ждем следующих. Очень познавательно.
@YouCanKeepSilence6 жыл бұрын
Автору огромный респект)
@il77125 жыл бұрын
спасибо, божественно
@sagramor6 жыл бұрын
Очень годный контент, спасибо за него. Продолжай в том же духе! Донаты будут!)
@evgenykuznetsov74904 жыл бұрын
Олег, спасибо за полезные знания, задонатил.
@richblessbigsmoke97812 жыл бұрын
Спасибо за отличный урок
@viktorshuryha37786 жыл бұрын
Жду 8 и 9 часть. Спасибо за видео!
@coffeecoder73686 жыл бұрын
как всегда. Хорошая работа, Олег
@TonyFlexPromo4 жыл бұрын
Большое спасибо за туториалы!
@MrYoklmn6 жыл бұрын
Олег, приветствую. Я не по теме видоса. Ты пропал. Это печально) появляйся скорее с новым видео. Если можешь снять видео про Celery или просто рассказать, как удаленно на сервере заставить питоновские скрипты работать по расписанию или по событиям- было бы очень здорово. Я знаю, что ты читаешь комментарии. Надеюсь, прочитаешь и мой. Удачи и спасибо!
@АлексейЯнков-т9л5 жыл бұрын
MrYoklmn где Олег? Что случилось как так
@johnsmith-yk5vz5 жыл бұрын
celery было бы хорошим продолжением серии по django и asyncio
@ДанькаЛобанов-у6ю6 жыл бұрын
большое спасибо за серию видео. очень позновательно
@Bobronium6 жыл бұрын
Потрясающая серия роликов, спасибо!
@mooderatorpro6 жыл бұрын
Если честно, пока сам не начал играться с асинхронность - все объяснения как об стенку горох. Сделал на grequests + asyncio быстрый асинхронный парсер заголовков страниц (в качестве теста). Сравнил с тем же решением на обычных реквестах и многопроцессорности - реально быстрее получается на асинхроне прогрузить пачку страниц. Если кому интересно, могу показать код.
@saitaro5 жыл бұрын
Интересно, покажите!
@КузнецовСергей-н2ф3 жыл бұрын
Макс привет
@imortpsixo Жыл бұрын
Для тех, у кого зависает асинхронная загрузка. Скорее всего это не баг в коде, а блокировка со стороны сервера. Попробуйте воспользоваться другим котогенератором.
@ggkamv69375 жыл бұрын
спасибо огромное этому человеку!
@mikesomebody54045 жыл бұрын
Топовый контент по asyncio в русском ютубе.
@gnompirogov92592 жыл бұрын
Спасибо. Тяжело дается :)))))))
@laticalamonzi28146 жыл бұрын
честь и хвала. спасибо!
@НиколайКочкин-в8с Жыл бұрын
Супер🤟
@dv-key3 жыл бұрын
Олег, ну вы серьезно считерили в своем сравнении синхронной и асинхронной загрузки картинок. Вы получили около 12 сек при синхронной загрузке, и около одной сек при асинхронной. Вот только в первом случае вы не использовали сессию, а во втором использовали! Выглядит все так, как будто производительность увеличилась в 12 раз из-за асинхронности. На самом же деле эксперимент не чистый. Проверил у себя, получил такие цифры: без сохранения сессии на 10 запросов уходит 2-3 сек если запрашивать в рамках одной сессии ~1,5 сек asyncio + session - около 1 сек. А вообще спасибо, вас приятно смотреть, все грамотно, чувствуется хорошее понимание.
@Das.Kleine.Krokodil3 жыл бұрын
и в чем причина этого?
@dv-key3 жыл бұрын
@@Das.Kleine.Krokodil В том что с использованием Session при направлении запроса к хосту у вас не будет устанавливаться новое соединение, а будет переиспользовано старое. Соответственно экономится время. И по моим замерам на моих примерах получилось, что именно это в первую очередь дало прирост скорости, а уже во вторую асинхронность.
@Das.Kleine.Krokodil3 жыл бұрын
@@dv-key спасибо
@vadiculus58922 жыл бұрын
Спасибо огромное вам! Жаль что это всё что я могу сделать) Не представляю где бы я брал эту инфу. В жизни бы не подумал что асинхронность основана на генераторах
@kinquelele72772 жыл бұрын
Классно объясняешь, но не слова про async for, этим можно было бы еще упростить код в последнем примере (допускаю, что в 2018 его могло еще не быть, но вроде все-таки был). Насчет работы с http через сессии все верно, но если в синхронном варианте использовать request.session, то тоже будет прирост скорости, хоть и не большой
@ntvisigoth3 жыл бұрын
Огонь! Но если честно я раз 20 откручивал некоторые места. Потому что в некоторых местах слишком быстро говорите, а надо было бы чуть медленнее. Есть места, которые надо прям на подкорку записать и поэтому они обязаны быть проговоренными в очень медленном темпе
@Grixa18099 ай бұрын
спасибо из 24 года)
@slonbeskonechen83103 жыл бұрын
Класс! Спасибо большое!
@imgnl6 жыл бұрын
Спасибо, Олег!
@dmitryk94404 жыл бұрын
Долго не мог понять как все-таки устроена функция await, когда хотел именно использовать синхронные методы (вместо aiohttp), но эта статья окончатель все пояснила: habr.com/ru/post/453348/ P.S. благодаря предыдущим видео разобрался легко в статье.
@m0ntecr1st045 жыл бұрын
Начинало смотреть 22к людей, закончило - 11к. вывод - либо половина умерла от асинхронки, либо она им просто не зашла)
@temamart-k5 жыл бұрын
это еще отличный результат, обычно какие-то курсы - первый урок 35к, второй - 20к, десятый - 1.5к)
@amrklp5 жыл бұрын
Либо кто-то нашел для себя решение и не стал смотреть все остальное.
@temamart-k5 жыл бұрын
Amarok ты внимательно смотрел курс?
@amrklp5 жыл бұрын
@@temamart-k Я канал начал смотреть именно с этого видео, потому как мне надо было разобраться именно с asyncio, посмотрел еще другие видео, не по теме асинхронности. Мне нужно было разобраться в вопросе - я нашел объяснение. А уж всей темой в целом я ознакомлюсь как-нибудь потом.
@amrklp3 жыл бұрын
@Sensei - Says Да, спасибо, что переживали за меня все это время.
@Biongar2 жыл бұрын
Очень круто, спасибо большое за курс, но где же реализация примера из первого видео на async await?)
@vor67588 күн бұрын
Можно как-то достать URL, как в примере с синхронным запросом?
@karinmsc4 жыл бұрын
Шикарно
@boris.shestov5 жыл бұрын
Спасибо за урок. Подскажите. Если использовать модуль multiprocessing для решения аналогичной задачи, как в конце видео, в примере с картинками? Уместно ли это? И какой результат в скорости был бы? Примерно такой же?
@zaemiel5 жыл бұрын
Если процессов будет по количеству ядер процессора, то это даст определенный прирост в скорости. Но в общем и целом для IO-задач (а работа с сетью - это она) используются потоки. Насколько это будет быстрее по сравнению с асинхронным решением - я не знаю. Проверьте.
@версиянедоступна2 жыл бұрын
Огонь!
@savel2work4 жыл бұрын
Спасибо, превосходное объяснение темы. Наконец-то стало до конца ясно, как именно работает асинхронность в питоне! Олег, а как asyncio превращает обычную функцию в генератор? Чтобы бесконечный цикл внутри не блокировал выполнение? Или вы тут этого добивались как раз с помощью asyncio.sleep, которая превращала нашу функцию в обёртку для генератора из модуля asyncio? А ensure_future (create task) занимается инициализацией генераторов, да? И наконец не могу не спросить: а что если мы await используем вместо конструкции yield from в классическом генераторе (хочу понять: это просто синтаксический сахар или там изменилось поведение)? В общем, ещё раз благодарю за замечательное объяснение.
@unaibekovbakhyt65176 жыл бұрын
даю слово, что как устроюсь мидл прогером благодаря тебе - то обязательно озолочу ручку). спасибо большое
@Небагафича-ф9л6 жыл бұрын
мне будучи джуном ничего не мешает отспыпать гроши))
@Небагафича-ф9л5 жыл бұрын
@Lorem Ipsum всмысле?
@Небагафича-ф9л5 жыл бұрын
@Lorem Ipsum Без развития - никуда. Но многое упирается в сферу рынка в которой ты работаешь. Например, мне приходится создатавать карты и геоинформационные ресурсы, которые требуют знания территориального устройства, знания законов, знания в сфере кадастровой и рыночной оценки и.т.д. Но это везде так, например, друг работает программистом на бирже, как в фильме волк с уолл стрит(только без шлюх и наркотиков) и ему приходится изучать тонкости этой отрасли
@Небагафича-ф9л5 жыл бұрын
@Lorem Ipsum и вам
@ЭстетичнаяМузыка-г2ъ3 жыл бұрын
И как успехи?
@titov_ev3 жыл бұрын
Смотрю вроде как понятно, потом снова смотрю и не понятно где ставятся async и await. Понял только что в обяъвление фунций ставим async, а когда вызываем await, но в остальных случаях не совсем понятно.
@ntvisigoth2 жыл бұрын
@Олег Молчанов: 9:05 В этих ваших словах нет ошибки? Вы говорите, что если корутина вызывает некоторую блокирующую функцию, то она также приостанавливается, но контроль выполнения возвращается обратно в событийный цикл Мне кажется в этих словах у вас ошибка. Дело в том, что мы и пишем асинхронный код раз из-за того, что блокирующие функции не возвращаются выполнения пока не выполнятся. Если вызвать блокирующую функцию, то возврата в событийный цикл не произойдет до тех пор пока блокирующая функция не будет выполнена и таким образом событийный зависнет. Возможно вы хотели сказать о другой ситуации? Прошу вас пояснить
@peskovdev2 жыл бұрын
Как я понял, смысл в том, что фреймворк перед вызовом блокирующей функции отдает контроль выполнения, подобно тому как это делали мы в 4_async_gens.py через yield.
@KAKRIK Жыл бұрын
Привет! Ты знаешь, как можно помирить async и Buildozer? Знаю, что ты делал приложение на python, может сталкивался с такой проблемой…
@DRanduletti2 жыл бұрын
9:03 Разве если корутина вызывает блокирующую функцию - то контроль передаётся в событийный цикл? Я попробовал запустить sleep(3) в одной из корутин - все задачи "заснули". Если вызываешь в корутине await asyncio.sleep(3) - то да- другие задачи из событийного цикла продолжают свою работу. Или Олег это и называет блокирующей функцией await asyncio.sleep(3) ?
@МаратАхметзянов-э5ч29 күн бұрын
Псевдо asyncio без классов и обработки ошибок. Старался соответствовать стилю Олега: import socket from select import select def async_accept(server: socket.socket): yield "read", server return server.accept()[0] def async_recv(client: socket.socket, bufsize=1024): yield "read", client return client.recv(bufsize) def async_send(client: socket.socket, data): yield "write", client return client.send(data) def create_task(gen): if not hasattr(event_loop, "tasks"): event_loop.tasks = [] event_loop.tasks.append(gen) def async_server(): HOST = "localhost" PORT = 5555 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind((HOST, PORT)) server_socket.listen() print(f"Server listening on {HOST}:{PORT}") with server_socket: while True: conn = yield from async_accept(server_socket) # await print(f"Accepted connection from {conn.getpeername()}") create_task(async_client(conn)) # concurrent task def async_client(client: socket.socket): with client: while True: data = yield from async_recv(client, 1024) # await if not data: print(f"Client {client.getpeername()} disconnected") break print(f"Received data from {client.getpeername()}: {data.decode()}") sended = yield from async_send(client, data) # await print(f"Sent data to {client.getpeername()}: {data.decode()}") def event_loop(): if not hasattr(event_loop, "tasks"): event_loop.tasks = [] tasks = event_loop.tasks to_read = {} to_write = {} while any([tasks, to_read, to_write]): while not tasks: ready_to_read, ready_to_write, _ = select(to_read, to_write, [], 1) for sock in ready_to_read: tasks.append(to_read.pop(sock)) for sock in ready_to_write: tasks.append(to_write.pop(sock)) try: task = tasks.pop(0) action, sock = next(task) if action == "read": to_read[sock] = task elif action == "write": to_write[sock] = task except: pass print("Event loop finished") if __name__ == "__main__": create_task(async_server()) event_loop()
@alexeyalexeevich32152 жыл бұрын
У кого код выдает ошибку Event loop is closed - это проблема с aiohttp. (и похоже только на винде). Решается добавлением одной строчки перед RUN: asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) asyncio.run(main2())
@МаксОгн Жыл бұрын
Некоторые вещи я всё таки не пойму. К примеру почему я должен боятся функции sleep(), если они как говорит автор полностью асинхронны? И это во первых. Во вторых хотелось бы узнать чем будет лучше использовать именно метод построения асинхронной программы из видео, чем метод с библиотекой threading? Метод threading тоже из функции делает что-то подобное или я где-то ошибаюсь? Поясните плиз.
@titov_ev3 жыл бұрын
Было бы логичнее завершить этот раздел использовав тот же самый пример клиент сервера, что и был в предыдущих видео.
@artdev87035 жыл бұрын
Отличное объяснение а вот с 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() ``` получается медленнее чем синхронно писать файлы
@dmitryk94404 жыл бұрын
Потому что aiofile использует многопоточность, а я так понял в python это целая проблема, так как она реализуется через прослойку gil, которая призвана упростить работу с потоками. И по факту в каждый момент времени процессор выполняет только один поток. (habr.com/ru/post/149420/). Плюс есть еще проблема с одновременной записью нескольких файлов (можно проверить так поставить на копирование очередью и одновременно нескольких, очередь выиграет, особенно если фалов много). (dmlab.ru/python-aiofiles-vs-aiofile)
@denissavast3 жыл бұрын
Благодарю!!!!!!!
@merzbow73 жыл бұрын
с asyncio.run(main()) почему-то не работает, RuntimeError: Event loop is closed выдаёт а вот по старинке с : loop = asyncio.get_event_loop() loop.run_until_complete(main()) работает.
@ЭстетичнаяМузыка-г2ъ3 жыл бұрын
тоже самое было, спасибо😉
@АлексейЕршов-у3г3 жыл бұрын
Подтверждаю. Хотя картинки скачались. Куда копать? Хочу asyncio.run(main()) без ошибок рантайма.
@merzbow73 жыл бұрын
@@АлексейЕршов-у3г win? вроде эта ошибка у меня была именно на винде. на линукс такой проблемы нет
@АлексейЕршов-у3г3 жыл бұрын
Да, на win. Проверил в Арче - всё Ок.
@merzbow73 жыл бұрын
@@АлексейЕршов-у3г отсюда вывод, программировать под linux. какая-то проблема именно в библиотеке под win, я дотошно не изучал, или loop.run_until_complete
@dmitrytsmyh59715 жыл бұрын
Олег, спасибо за видео. Огромная просьба выпустить видео со слушающим сервером aiohttp, внутри которого запросы с ClientSession на другой сервер. Вопрос в двух Event Loop. Одна встроенная в aiohttp.web и другая в asyncio. Зарание благодарю!
@constchoven3 жыл бұрын
19:00 - не понимаю, зачем нам эти декораторы? Чтобы сделать корутины? Разве наши ф-ции не становятся ими автоматически при ```yield from```? Я запутался
@Das.Kleine.Krokodil3 жыл бұрын
а вы посмотрите что там внутри декораторов, в самой библиотеке
@orkhangasanov11 ай бұрын
Аналогичный вопрос возник и у меня. Если 6 уроков до этого разжёвывают всё до мелких деталей, плюс также в предыдущем уроке показывают пример декоратора корутины для первой инициализации. То здесь этот момент упущен. Классическое "сам пройди и посмотри, что там внутри" - ну ок, пройдем и посмотрим.
@Вадим-ы7ч2в5 жыл бұрын
Вопрос, к автору. Видео действительно хорошие. Но почему бы в конце плейлиста не дать ссылку на гит репозиторий?
@johnsmith-yk5vz5 жыл бұрын
автор не дает готовый код, (и правильно делает) предполагая, что мы должны все понять и написать своё.
@Thisstheend5 жыл бұрын
дает, но за деньги
@viktor35124 жыл бұрын
Зачем использовать декоратор, если мы используем yield from который делает функцию корутиной? И почему рядом с asyncio.sleep(1) используем yield from? Заранее спасибо.
@eduardmart12375 жыл бұрын
Шикакрные видосы! Даже лучше чем у англоязычных коллег. (индусов не считаем ☻) Также хотел спросить, а есть простой способ и файлы асинхронно записывать? Я ведь понимаю что file.write(data) это блокирующая операция?
@zaemiel5 жыл бұрын
В начале этого видео я об этом говорил.
@vanya153695 жыл бұрын
Олег, можете посоветовать дополнительные материалы для изучение асинхронного программирования в Python? В т.ч. по asyncio, aiohttp. Спасибо)
@Das.Kleine.Krokodil3 жыл бұрын
рекомендую видео американских авторов нередко попадаются очень методичные и грамотные яндекс-браузер позволяет смотреть в онлайн переводе озвучке
@Сержик-в7ц5 жыл бұрын
Олег, привет! Круто было бы сделать серию про Docker. Очень востребованная штука, а на русскоязычном ютубе про него вообще ничего полезного. Спасибо за труды!
@pospos4395 жыл бұрын
а нельзя вместо первой блокирующей функции использовать пользовательский ввод? а вторая функция от этого ввода будет менять свое поведение не прекращая своей работы
@MrGerka0291 Жыл бұрын
Сотни лайков!!!! ❤❤❤
@kde4165 жыл бұрын
Приветствую, подкажите в каком видео вы рассказывали про SOLID ?
@ImPetrucho5 жыл бұрын
Здравствуйте, спасибо за видео! Расскажите, пожалуйста, что лучше использовать для скорости (например, обработки веб-сокетов) асинхронное программирование или потоки (модуль threading)? Заранее спасиьо
@dmitryk94404 жыл бұрын
Хоть и поздно, но отвечу сервер Apache использует многопоточность, а nginx ассинхронные сокеты. Nginx сейчас всех делает по производительности. Так что выбор в этом плане очевиден.
@nordost84 жыл бұрын
А синхронная функция write_image() как-то влияет на выполнение асинхронного кода? Она как-то блокирует выполнение тасков?
@ilyastrojnov76274 жыл бұрын
Конечно, это блокирующий вызов, переключение контента возможно в местах вызова await, в этот момент event_loop смотрит на исполнение тасков, чтобы перейти к ним. Но если эта синхронная функция быстрая - то и фиг с ней.
@hwedarby10 ай бұрын
Если кто-то как и я столкнулся с ошибкой "RuntimeError: Event loop is closed" на windows, то мне помогло решение добавить перед asyncio.run(main2()) строку asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())