Основы асинхронности в Python #7: Asyncio, async/await

  Рет қаралды 110,119

Oleg Molchanov

Oleg Molchanov

Күн бұрын

Пікірлер: 252
@artemchege
@artemchege 3 жыл бұрын
Страдал также как и вы в попытке перестроить свой мозг и привычку думать синхронно и вот что помогло именно мне: открываете пайчарм, пишите асинхронные примеры Олега или выдумываете свои, создаёте точку входа main и прям там сразу ставите дебаггер в паузу. А после неспешна и по шагам смотрите как, что и в какой последовательности выполняется. И сразу резко все становится понятно, а работа async/await прозрачна. Await это лишь точки в которых event loop бросает выполнение скрипта на некоторое время и бежит обслуживать следующий скрипт в очереди. И все. Как только второй скрипт спотыкается об await, event loop бежит обслуживать первого, если тот готов. И так до конца.
@igorkulibaba7287
@igorkulibaba7287 6 жыл бұрын
Как же классно Олег объясняешь! От души доначу знаю что помощь твоя не оценима. Спасибо
@sergeyshevtsov5125
@sergeyshevtsov5125 4 жыл бұрын
Спустя год вернулся к этому циклу видосов. В первый раз не осознал, слишком поверхностное было понимание. Сейчас смотрел, осознавал, имплементировал все примеры самостоятельно. И вот теперь пришло понимание. Спасибо, Олег. Как всегда очень ценный контент. Надеюсь, что будешь потихоньку продолжать раскрывать непростые и нужные темы.
@vlad_gnom
@vlad_gnom 7 ай бұрын
Спасибо Олегу за прекрасный курс, многое приоткрылось из под ширмы. Приколько знать, как все это работает с минимальным уровнем абстракций. Автору выражаю большую благодарность за потраченное время.❤️
@bip-bip-tip
@bip-bip-tip 10 ай бұрын
Олег, курс огонь, спасибо огрменное! Тем кто досмотрел до этого видео и ничего не понял сходу (как я при первом подходе): - Начать смотреть цикл видео с самого начала - Если повторять за видео,а ещё лучше - ставить на паузу и пытаться самому написать код, а потом смотреть дальше, то всё становится понятно. Я прям почувствовал, как преисполнился в познании, после того как понял механизм работы yield from (await) =) - На предыдущих видео дебажить код по строкам тоже очень полезно, особенно, если вы какие-то свои дополнительные примеры придумываете (ответить клиенту что-нибудь сразу после accept-а, например) - Если сложно - не сдавайтесь! Понимание придёт со временем =) P.S. Cправедливости ради, request на сессиях тоже работает быстрее, чем обычный get (примерно в два раза), но медленнее чем асинхронный код)
@peskovdev
@peskovdev 2 жыл бұрын
Не досчитался 2ух уроков: 1) Реализовать часть функционала asyncio по превращению функции в корутину 2) Дописать сервер с сокетами с async/await Но в целом серия уроков дала ОООООООЧЕНЬ сильный старт в асинхронности, думаю до этих пунктов дойду самостоятельно. Автору огромное спасибо! Даже в 22 году инфа актуальна)
@Biongar
@Biongar 2 жыл бұрын
Да, я тоже заметил что сервер с async/await так и не написан, а жаль, пример был бы очень хороший
@МаратАхметзянов-э5ч
@МаратАхметзянов-э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()
@trankov
@trankov 4 жыл бұрын
Господи, как же обалденно. Хочу, чтобы все учебники по Питону были такими.
@figaro2440
@figaro2440 6 жыл бұрын
Спасибо. Олег Молчанов это лучшее что есть по питону в русском ютубе.
@АлександрБойко-у3ы
@АлександрБойко-у3ы 2 жыл бұрын
Большое спасибо. Самое лучшее объяснение асинхронности Python которое я увидел. Особенно понравилось, что объяснение началось с азов. Больше узнал и понял про функции генераторы. Последние примеры тоже огонь! С удовольствием задоначу.
@yodapunishes
@yodapunishes 5 жыл бұрын
Потрясающе! Олег, было бы ещё очень интересно послушать от Вас про многопоточность / мультипроцессность / асинхронность, в плане где и что уместно применять. Наверняка у каждой схемы есть какие-то свои побочки на память, загрузку ЦП и т.д.
@suzuyah
@suzuyah 4 жыл бұрын
спустя 2 года наткнулся на этот плейлист и теперь благодаря нему разобрался во всём концепте async / await, что они из себя представляют и что такое event loop, день прошёл не зря
@antistress_pro
@antistress_pro 2 жыл бұрын
Очень, очень доходчиво. Спасибо, Олег Молчанов. Не знаю, занимаетесь ли преподаванием сейчас, но Вы, сделали очень большое и полезное дело. На мой взгляд - лучшая подача материала, которую я встречал.
@at1set590
@at1set590 7 ай бұрын
Воу, какая поставленная речь, какой прекрасный гайд и не так, как другие рассказывают ни то ни сё, воду разливают, просто прекрасно. Видно, что у автора огромный опыт за плечами, однозначно лайк👍
@Overlap_ed
@Overlap_ed 3 жыл бұрын
Олег, огромное вам спасибо. Как только устроюсь - обязательно с первой зп скину донат! Очень крутые уроки!
@benyomin94
@benyomin94 6 жыл бұрын
Олег, спасибо за еще одну прекрасную серию! В будущем интересно было бы послушать вас про функциональное программирование на python
@do_not_put_login_in_alias
@do_not_put_login_in_alias 2 жыл бұрын
Отличный цикл видео. Спасибо огромное. Сначала на одном дыхании посмотрел всю серию, потом вернулся и на всех лайки поставил :)
@it_is_muchomor
@it_is_muchomor 2 жыл бұрын
На win10 столкнулся с двумя ошибками(скорее особенностями). 1. Программа заканчивается с ошибкой event loop is closed. Лечится установкой параметра asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()), перед вызовом asyncio.run(main(2)) 2. Сохраняется всего 1-2 файла. Проблема в особенности получения времени в Windows. Файлы, тупо, называются одним именем и перезаписывают друг друга. Лечится иным способом именования. По поводу курса - ОГОНЬ!!! Олег объясняет как боженька) Жаль пропал человек(((
@ЕрвандАгаджанян-в3к
@ЕрвандАгаджанян-в3к 3 жыл бұрын
Невозможно поверить, что может существовать настолько качественный контент)))
@darkmatiz
@darkmatiz 6 жыл бұрын
Олег, кроме вас таких подробных руководств пока не нашел на Ютубе. Да, есть конечно курсы разные и т.д. - это отдельная всё таки вещь, там разбираюсь всё от базовых вещей, а потом разбирают на кейсах. Но ваши разборы в этом формате - очень конкурентные, спасибо. Ну и конечно: приятный голос, правильно объясняете - вам бы лекции вести :)
@zaemiel
@zaemiel 6 жыл бұрын
Спасибо
@FrolovDaniil
@FrolovDaniil 4 жыл бұрын
@Animus Pexus Не осилил?) Нормальный это ассемблер?
@FrolovDaniil
@FrolovDaniil 4 жыл бұрын
@Animus Pexus Чисто из любопытства) Какие всё же языки вы считаете нормальными и почему? В палемику вступать не собираюсь, просто интересно))
@FrolovDaniil
@FrolovDaniil 4 жыл бұрын
@Animus Pexus Дружище, просто шутка, не хотел обидеть))
@acerswift4386
@acerswift4386 4 жыл бұрын
@Animus Pexus Go крутой, да?
@TheEBPO
@TheEBPO 4 ай бұрын
Крутой курс по базе асинк, Спасибо!
@leomysky
@leomysky 3 жыл бұрын
Это просто что-то невероятное Спасибо, Олег!
@nonpiramid
@nonpiramid 3 жыл бұрын
Одно из полезнейших видео, просмотренных мной в жизни
@alexseydugin8109
@alexseydugin8109 4 жыл бұрын
В 5 утра записывать видосы по асинхронности :) большой риспект вам
@TheMurodilla
@TheMurodilla 9 ай бұрын
Огромное спасибо вам, за ценный урок!
@raferi
@raferi 2 жыл бұрын
Отличные, замечательные уроки. Олег, спасибо за ваш труд. Очень полезный контент.
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil 3 жыл бұрын
00:00 Описание библиотеки Asyncio 10:32 Пример: асинхронный вывод чисел и счетчика 24:59 Пример: асинхронная скачка картинок из интернета
@pushkars9600
@pushkars9600 3 жыл бұрын
Ты просто лучший, спасибо ОГРОМНОЕ!
@Michael201078
@Michael201078 4 жыл бұрын
Спасибо. Очень хорошо объясняете. Приятно учиться и все понятно!
@vladimirpa177
@vladimirpa177 3 жыл бұрын
Огромное спасибо. Появилось понимание async
@АлекОним
@АлекОним 5 жыл бұрын
Большое спасибо за эту отличную серию видеоуроков!
@eq716
@eq716 3 жыл бұрын
Спасибо большое. Не пишу на Python но вьінужден его читать)) Интересньій язьік, спасибо за об'ьяснения
@OlesSmaha
@OlesSmaha 2 жыл бұрын
Олег, большое Вам спасибо за проделанную работу. На #5 и #6 усвоение информации для меня пошло немного тяжелее, разрыв шаблонов так сказать, но к этому уроку у меня, видимо, "прогрелся кэш", и информацию впитал на ура. :D Жаль, что вы не продемонстрировали возможность работы с файловой системой не прибегая к синхронной функции... Обратил внимание, что на Вашем канале нет новых видео уже 2 года, надеюсь, что у Вас всё хорошо! Очень понравилась ваша внимательность к деталям и в целом подача материала, Вы замечательный педагог. Возможно, в дальнейшем (по необходимости) ознакомлюсь с другими плейлистами с Вашего канала. Всех благ, очень благодарен!
@rlxinc.6016
@rlxinc.6016 2 жыл бұрын
Большое спасибо за курс!
@джонимантос
@джонимантос 5 жыл бұрын
Огромное спасибо за данное видео, очень много материала в интернете с неприменимыми к жизни примерами, благодаря вам наконец смог использовать asyncio
@mishkasensei
@mishkasensei 4 жыл бұрын
Посмотрел все 7 вдосиков, задонатил, теперь буду переваривать инфу, прояснилось многое, но кое-какие вещи надо ещё переварить и понять.
@andredru4278
@andredru4278 Жыл бұрын
Спасибо. Понравилось. Стало яснее.
@ikrugloff
@ikrugloff 5 жыл бұрын
Олег, спасибо большое за серию этих видео.
@artur.tokranov
@artur.tokranov Жыл бұрын
Отличные уроки! Спасибо большое!
@Иван-о1ш9ц
@Иван-о1ш9ц Жыл бұрын
Спасибо большое за видео, отличные!
@ShadowStormlq5mwdasd
@ShadowStormlq5mwdasd Жыл бұрын
Спасибо вам Олег
@guitar_hedonist
@guitar_hedonist 3 жыл бұрын
Настало время начать использовать асинхронный код, но вот провести соплями по реальному примеру некому. Сама суть ясная была еще на вводных курсах, но внятный вариант реализации только твой ) Очень хороший пример на основе aiohttp. Сама либа не сложная (тот же реквест только асинхронный), но вот не зная о ее существовании я бы бился с requests и ничего бы не добился ))) Спасибо тебе большое!
@aidarfachrutdinov
@aidarfachrutdinov 6 жыл бұрын
Спасибо за уроки. Ждем следующих. Очень познавательно.
@YouCanKeepSilence
@YouCanKeepSilence 6 жыл бұрын
Автору огромный респект)
@il7712
@il7712 5 жыл бұрын
спасибо, божественно
@sagramor
@sagramor 6 жыл бұрын
Очень годный контент, спасибо за него. Продолжай в том же духе! Донаты будут!)
@evgenykuznetsov7490
@evgenykuznetsov7490 4 жыл бұрын
Олег, спасибо за полезные знания, задонатил.
@richblessbigsmoke9781
@richblessbigsmoke9781 2 жыл бұрын
Спасибо за отличный урок
@viktorshuryha3778
@viktorshuryha3778 6 жыл бұрын
Жду 8 и 9 часть. Спасибо за видео!
@coffeecoder7368
@coffeecoder7368 6 жыл бұрын
как всегда. Хорошая работа, Олег
@TonyFlexPromo
@TonyFlexPromo 4 жыл бұрын
Большое спасибо за туториалы!
@MrYoklmn
@MrYoklmn 6 жыл бұрын
Олег, приветствую. Я не по теме видоса. Ты пропал. Это печально) появляйся скорее с новым видео. Если можешь снять видео про Celery или просто рассказать, как удаленно на сервере заставить питоновские скрипты работать по расписанию или по событиям- было бы очень здорово. Я знаю, что ты читаешь комментарии. Надеюсь, прочитаешь и мой. Удачи и спасибо!
@АлексейЯнков-т9л
@АлексейЯнков-т9л 5 жыл бұрын
MrYoklmn где Олег? Что случилось как так
@johnsmith-yk5vz
@johnsmith-yk5vz 5 жыл бұрын
celery было бы хорошим продолжением серии по django и asyncio
@ДанькаЛобанов-у6ю
@ДанькаЛобанов-у6ю 6 жыл бұрын
большое спасибо за серию видео. очень позновательно
@Bobronium
@Bobronium 6 жыл бұрын
Потрясающая серия роликов, спасибо!
@mooderatorpro
@mooderatorpro 6 жыл бұрын
Если честно, пока сам не начал играться с асинхронность - все объяснения как об стенку горох. Сделал на grequests + asyncio быстрый асинхронный парсер заголовков страниц (в качестве теста). Сравнил с тем же решением на обычных реквестах и многопроцессорности - реально быстрее получается на асинхроне прогрузить пачку страниц. Если кому интересно, могу показать код.
@saitaro
@saitaro 5 жыл бұрын
Интересно, покажите!
@КузнецовСергей-н2ф
@КузнецовСергей-н2ф 3 жыл бұрын
Макс привет
@imortpsixo
@imortpsixo Жыл бұрын
Для тех, у кого зависает асинхронная загрузка. Скорее всего это не баг в коде, а блокировка со стороны сервера. Попробуйте воспользоваться другим котогенератором.
@ggkamv6937
@ggkamv6937 5 жыл бұрын
спасибо огромное этому человеку!
@mikesomebody5404
@mikesomebody5404 5 жыл бұрын
Топовый контент по asyncio в русском ютубе.
@gnompirogov9259
@gnompirogov9259 2 жыл бұрын
Спасибо. Тяжело дается :)))))))
@laticalamonzi2814
@laticalamonzi2814 6 жыл бұрын
честь и хвала. спасибо!
@НиколайКочкин-в8с
@НиколайКочкин-в8с Жыл бұрын
Супер🤟
@dv-key
@dv-key 3 жыл бұрын
Олег, ну вы серьезно считерили в своем сравнении синхронной и асинхронной загрузки картинок. Вы получили около 12 сек при синхронной загрузке, и около одной сек при асинхронной. Вот только в первом случае вы не использовали сессию, а во втором использовали! Выглядит все так, как будто производительность увеличилась в 12 раз из-за асинхронности. На самом же деле эксперимент не чистый. Проверил у себя, получил такие цифры: без сохранения сессии на 10 запросов уходит 2-3 сек если запрашивать в рамках одной сессии ~1,5 сек asyncio + session - около 1 сек. А вообще спасибо, вас приятно смотреть, все грамотно, чувствуется хорошее понимание.
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil 3 жыл бұрын
и в чем причина этого?
@dv-key
@dv-key 3 жыл бұрын
@@Das.Kleine.Krokodil В том что с использованием Session при направлении запроса к хосту у вас не будет устанавливаться новое соединение, а будет переиспользовано старое. Соответственно экономится время. И по моим замерам на моих примерах получилось, что именно это в первую очередь дало прирост скорости, а уже во вторую асинхронность.
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil 3 жыл бұрын
@@dv-key спасибо
@vadiculus5892
@vadiculus5892 2 жыл бұрын
Спасибо огромное вам! Жаль что это всё что я могу сделать) Не представляю где бы я брал эту инфу. В жизни бы не подумал что асинхронность основана на генераторах
@kinquelele7277
@kinquelele7277 2 жыл бұрын
Классно объясняешь, но не слова про async for, этим можно было бы еще упростить код в последнем примере (допускаю, что в 2018 его могло еще не быть, но вроде все-таки был). Насчет работы с http через сессии все верно, но если в синхронном варианте использовать request.session, то тоже будет прирост скорости, хоть и не большой
@ntvisigoth
@ntvisigoth 3 жыл бұрын
Огонь! Но если честно я раз 20 откручивал некоторые места. Потому что в некоторых местах слишком быстро говорите, а надо было бы чуть медленнее. Есть места, которые надо прям на подкорку записать и поэтому они обязаны быть проговоренными в очень медленном темпе
@Grixa1809
@Grixa1809 9 ай бұрын
спасибо из 24 года)
@slonbeskonechen8310
@slonbeskonechen8310 3 жыл бұрын
Класс! Спасибо большое!
@imgnl
@imgnl 6 жыл бұрын
Спасибо, Олег!
@dmitryk9440
@dmitryk9440 4 жыл бұрын
Долго не мог понять как все-таки устроена функция await, когда хотел именно использовать синхронные методы (вместо aiohttp), но эта статья окончатель все пояснила: habr.com/ru/post/453348/ P.S. благодаря предыдущим видео разобрался легко в статье.
@m0ntecr1st04
@m0ntecr1st04 5 жыл бұрын
Начинало смотреть 22к людей, закончило - 11к. вывод - либо половина умерла от асинхронки, либо она им просто не зашла)
@temamart-k
@temamart-k 5 жыл бұрын
это еще отличный результат, обычно какие-то курсы - первый урок 35к, второй - 20к, десятый - 1.5к)
@amrklp
@amrklp 5 жыл бұрын
Либо кто-то нашел для себя решение и не стал смотреть все остальное.
@temamart-k
@temamart-k 5 жыл бұрын
Amarok ты внимательно смотрел курс?
@amrklp
@amrklp 5 жыл бұрын
@@temamart-k Я канал начал смотреть именно с этого видео, потому как мне надо было разобраться именно с asyncio, посмотрел еще другие видео, не по теме асинхронности. Мне нужно было разобраться в вопросе - я нашел объяснение. А уж всей темой в целом я ознакомлюсь как-нибудь потом.
@amrklp
@amrklp 3 жыл бұрын
@Sensei - Says Да, спасибо, что переживали за меня все это время.
@Biongar
@Biongar 2 жыл бұрын
Очень круто, спасибо большое за курс, но где же реализация примера из первого видео на async await?)
@vor6758
@vor6758 8 күн бұрын
Можно как-то достать URL, как в примере с синхронным запросом?
@karinmsc
@karinmsc 4 жыл бұрын
Шикарно
@boris.shestov
@boris.shestov 5 жыл бұрын
Спасибо за урок. Подскажите. Если использовать модуль multiprocessing для решения аналогичной задачи, как в конце видео, в примере с картинками? Уместно ли это? И какой результат в скорости был бы? Примерно такой же?
@zaemiel
@zaemiel 5 жыл бұрын
Если процессов будет по количеству ядер процессора, то это даст определенный прирост в скорости. Но в общем и целом для IO-задач (а работа с сетью - это она) используются потоки. Насколько это будет быстрее по сравнению с асинхронным решением - я не знаю. Проверьте.
@версиянедоступна
@версиянедоступна 2 жыл бұрын
Огонь!
@savel2work
@savel2work 4 жыл бұрын
Спасибо, превосходное объяснение темы. Наконец-то стало до конца ясно, как именно работает асинхронность в питоне! Олег, а как asyncio превращает обычную функцию в генератор? Чтобы бесконечный цикл внутри не блокировал выполнение? Или вы тут этого добивались как раз с помощью asyncio.sleep, которая превращала нашу функцию в обёртку для генератора из модуля asyncio? А ensure_future (create task) занимается инициализацией генераторов, да? И наконец не могу не спросить: а что если мы await используем вместо конструкции yield from в классическом генераторе (хочу понять: это просто синтаксический сахар или там изменилось поведение)? В общем, ещё раз благодарю за замечательное объяснение.
@unaibekovbakhyt6517
@unaibekovbakhyt6517 6 жыл бұрын
даю слово, что как устроюсь мидл прогером благодаря тебе - то обязательно озолочу ручку). спасибо большое
@Небагафича-ф9л
@Небагафича-ф9л 6 жыл бұрын
мне будучи джуном ничего не мешает отспыпать гроши))
@Небагафича-ф9л
@Небагафича-ф9л 5 жыл бұрын
@Lorem Ipsum всмысле?
@Небагафича-ф9л
@Небагафича-ф9л 5 жыл бұрын
​@Lorem Ipsum Без развития - никуда. Но многое упирается в сферу рынка в которой ты работаешь. Например, мне приходится создатавать карты и геоинформационные ресурсы, которые требуют знания территориального устройства, знания законов, знания в сфере кадастровой и рыночной оценки и.т.д. Но это везде так, например, друг работает программистом на бирже, как в фильме волк с уолл стрит(только без шлюх и наркотиков) и ему приходится изучать тонкости этой отрасли
@Небагафича-ф9л
@Небагафича-ф9л 5 жыл бұрын
@Lorem Ipsum и вам
@ЭстетичнаяМузыка-г2ъ
@ЭстетичнаяМузыка-г2ъ 3 жыл бұрын
И как успехи?
@titov_ev
@titov_ev 3 жыл бұрын
Смотрю вроде как понятно, потом снова смотрю и не понятно где ставятся async и await. Понял только что в обяъвление фунций ставим async, а когда вызываем await, но в остальных случаях не совсем понятно.
@ntvisigoth
@ntvisigoth 2 жыл бұрын
@Олег Молчанов: 9:05 В этих ваших словах нет ошибки? Вы говорите, что если корутина вызывает некоторую блокирующую функцию, то она также приостанавливается, но контроль выполнения возвращается обратно в событийный цикл Мне кажется в этих словах у вас ошибка. Дело в том, что мы и пишем асинхронный код раз из-за того, что блокирующие функции не возвращаются выполнения пока не выполнятся. Если вызвать блокирующую функцию, то возврата в событийный цикл не произойдет до тех пор пока блокирующая функция не будет выполнена и таким образом событийный зависнет. Возможно вы хотели сказать о другой ситуации? Прошу вас пояснить
@peskovdev
@peskovdev 2 жыл бұрын
Как я понял, смысл в том, что фреймворк перед вызовом блокирующей функции отдает контроль выполнения, подобно тому как это делали мы в 4_async_gens.py через yield.
@KAKRIK
@KAKRIK Жыл бұрын
Привет! Ты знаешь, как можно помирить async и Buildozer? Знаю, что ты делал приложение на python, может сталкивался с такой проблемой…
@DRanduletti
@DRanduletti 2 жыл бұрын
9:03 Разве если корутина вызывает блокирующую функцию - то контроль передаётся в событийный цикл? Я попробовал запустить sleep(3) в одной из корутин - все задачи "заснули". Если вызываешь в корутине await asyncio.sleep(3) - то да- другие задачи из событийного цикла продолжают свою работу. Или Олег это и называет блокирующей функцией await asyncio.sleep(3) ?
@МаратАхметзянов-э5ч
@МаратАхметзянов-э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()
@alexeyalexeevich3215
@alexeyalexeevich3215 2 жыл бұрын
У кого код выдает ошибку Event loop is closed - это проблема с aiohttp. (и похоже только на винде). Решается добавлением одной строчки перед RUN: asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) asyncio.run(main2())
@МаксОгн
@МаксОгн Жыл бұрын
Некоторые вещи я всё таки не пойму. К примеру почему я должен боятся функции sleep(), если они как говорит автор полностью асинхронны? И это во первых. Во вторых хотелось бы узнать чем будет лучше использовать именно метод построения асинхронной программы из видео, чем метод с библиотекой threading? Метод threading тоже из функции делает что-то подобное или я где-то ошибаюсь? Поясните плиз.
@titov_ev
@titov_ev 3 жыл бұрын
Было бы логичнее завершить этот раздел использовав тот же самый пример клиент сервера, что и был в предыдущих видео.
@artdev8703
@artdev8703 5 жыл бұрын
Отличное объяснение а вот с 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() ``` получается медленнее чем синхронно писать файлы
@dmitryk9440
@dmitryk9440 4 жыл бұрын
Потому что aiofile использует многопоточность, а я так понял в python это целая проблема, так как она реализуется через прослойку gil, которая призвана упростить работу с потоками. И по факту в каждый момент времени процессор выполняет только один поток. (habr.com/ru/post/149420/). Плюс есть еще проблема с одновременной записью нескольких файлов (можно проверить так поставить на копирование очередью и одновременно нескольких, очередь выиграет, особенно если фалов много). (dmlab.ru/python-aiofiles-vs-aiofile)
@denissavast
@denissavast 3 жыл бұрын
Благодарю!!!!!!!
@merzbow7
@merzbow7 3 жыл бұрын
с asyncio.run(main()) почему-то не работает, RuntimeError: Event loop is closed выдаёт а вот по старинке с : loop = asyncio.get_event_loop() loop.run_until_complete(main()) работает.
@ЭстетичнаяМузыка-г2ъ
@ЭстетичнаяМузыка-г2ъ 3 жыл бұрын
тоже самое было, спасибо😉
@АлексейЕршов-у3г
@АлексейЕршов-у3г 3 жыл бұрын
Подтверждаю. Хотя картинки скачались. Куда копать? Хочу asyncio.run(main()) без ошибок рантайма.
@merzbow7
@merzbow7 3 жыл бұрын
@@АлексейЕршов-у3г win? вроде эта ошибка у меня была именно на винде. на линукс такой проблемы нет
@АлексейЕршов-у3г
@АлексейЕршов-у3г 3 жыл бұрын
Да, на win. Проверил в Арче - всё Ок.
@merzbow7
@merzbow7 3 жыл бұрын
@@АлексейЕршов-у3г отсюда вывод, программировать под linux. какая-то проблема именно в библиотеке под win, я дотошно не изучал, или loop.run_until_complete
@dmitrytsmyh5971
@dmitrytsmyh5971 5 жыл бұрын
Олег, спасибо за видео. Огромная просьба выпустить видео со слушающим сервером aiohttp, внутри которого запросы с ClientSession на другой сервер. Вопрос в двух Event Loop. Одна встроенная в aiohttp.web и другая в asyncio. Зарание благодарю!
@constchoven
@constchoven 3 жыл бұрын
19:00 - не понимаю, зачем нам эти декораторы? Чтобы сделать корутины? Разве наши ф-ции не становятся ими автоматически при ```yield from```? Я запутался
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil 3 жыл бұрын
а вы посмотрите что там внутри декораторов, в самой библиотеке
@orkhangasanov
@orkhangasanov 11 ай бұрын
Аналогичный вопрос возник и у меня. Если 6 уроков до этого разжёвывают всё до мелких деталей, плюс также в предыдущем уроке показывают пример декоратора корутины для первой инициализации. То здесь этот момент упущен. Классическое "сам пройди и посмотри, что там внутри" - ну ок, пройдем и посмотрим.
@Вадим-ы7ч2в
@Вадим-ы7ч2в 5 жыл бұрын
Вопрос, к автору. Видео действительно хорошие. Но почему бы в конце плейлиста не дать ссылку на гит репозиторий?
@johnsmith-yk5vz
@johnsmith-yk5vz 5 жыл бұрын
автор не дает готовый код, (и правильно делает) предполагая, что мы должны все понять и написать своё.
@Thisstheend
@Thisstheend 5 жыл бұрын
дает, но за деньги
@viktor3512
@viktor3512 4 жыл бұрын
Зачем использовать декоратор, если мы используем yield from который делает функцию корутиной? И почему рядом с asyncio.sleep(1) используем yield from? Заранее спасибо.
@eduardmart1237
@eduardmart1237 5 жыл бұрын
Шикакрные видосы! Даже лучше чем у англоязычных коллег. (индусов не считаем ☻) Также хотел спросить, а есть простой способ и файлы асинхронно записывать? Я ведь понимаю что file.write(data) это блокирующая операция?
@zaemiel
@zaemiel 5 жыл бұрын
В начале этого видео я об этом говорил.
@vanya15369
@vanya15369 5 жыл бұрын
Олег, можете посоветовать дополнительные материалы для изучение асинхронного программирования в Python? В т.ч. по asyncio, aiohttp. Спасибо)
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil 3 жыл бұрын
рекомендую видео американских авторов нередко попадаются очень методичные и грамотные яндекс-браузер позволяет смотреть в онлайн переводе озвучке
@Сержик-в7ц
@Сержик-в7ц 5 жыл бұрын
Олег, привет! Круто было бы сделать серию про Docker. Очень востребованная штука, а на русскоязычном ютубе про него вообще ничего полезного. Спасибо за труды!
@pospos439
@pospos439 5 жыл бұрын
а нельзя вместо первой блокирующей функции использовать пользовательский ввод? а вторая функция от этого ввода будет менять свое поведение не прекращая своей работы
@MrGerka0291
@MrGerka0291 Жыл бұрын
Сотни лайков!!!! ❤❤❤
@kde416
@kde416 5 жыл бұрын
Приветствую, подкажите в каком видео вы рассказывали про SOLID ?
@ImPetrucho
@ImPetrucho 5 жыл бұрын
Здравствуйте, спасибо за видео! Расскажите, пожалуйста, что лучше использовать для скорости (например, обработки веб-сокетов) асинхронное программирование или потоки (модуль threading)? Заранее спасиьо
@dmitryk9440
@dmitryk9440 4 жыл бұрын
Хоть и поздно, но отвечу сервер Apache использует многопоточность, а nginx ассинхронные сокеты. Nginx сейчас всех делает по производительности. Так что выбор в этом плане очевиден.
@nordost8
@nordost8 4 жыл бұрын
А синхронная функция write_image() как-то влияет на выполнение асинхронного кода? Она как-то блокирует выполнение тасков?
@ilyastrojnov7627
@ilyastrojnov7627 4 жыл бұрын
Конечно, это блокирующий вызов, переключение контента возможно в местах вызова await, в этот момент event_loop смотрит на исполнение тасков, чтобы перейти к ним. Но если эта синхронная функция быстрая - то и фиг с ней.
@hwedarby
@hwedarby 10 ай бұрын
Если кто-то как и я столкнулся с ошибкой "RuntimeError: Event loop is closed" на windows, то мне помогло решение добавить перед asyncio.run(main2()) строку asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
小丑教训坏蛋 #小丑 #天使 #shorts
00:49
好人小丑
Рет қаралды 54 МЛН
Beat Ronaldo, Win $1,000,000
22:45
MrBeast
Рет қаралды 158 МЛН
Гениальное изобретение из обычного стаканчика!
00:31
Лютая физика | Олимпиадная физика
Рет қаралды 4,8 МЛН
Сестра обхитрила!
00:17
Victoria Portfolio
Рет қаралды 958 М.
Основы Asyncio
53:25
Python Russian
Рет қаралды 27 М.
Основы асинхронности в Python #1: Введение
17:43
ASYNCIO НА ПРАКТИЧЕСКОМ ПРИМЕРЕ
22:44
luchanos
Рет қаралды 28 М.
小丑教训坏蛋 #小丑 #天使 #shorts
00:49
好人小丑
Рет қаралды 54 МЛН