отлично обьяснил. Я вчера сидел тупил с этими моками. Вроде понял но не понял. А после видео точно понял. Красавец
@yanalex912510 күн бұрын
Для наглядности хорошо было бы в синхронном варианте так же использовать сессии, путает что они почему то появляются в аинхронном варианте.
@TAF300011 күн бұрын
Когда следующий раз настанет?)
@МаратАхметзянов-э5ч12 күн бұрын
Псевдо 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()
@yanalex912514 күн бұрын
Почему цикл event_loop не зависает на функциях send_message и accept_connection, accept и recv ведь должны замораживаться при ожидании - функции то запущены не асинхронно. Полагаю потому что мы проходимся по уже готовым для обработки соединениям, тогда для наглядности нужно было это добавить в нерефаченый код, чтобы было понятно откуда взялась сама "асинхронность"
@klaxwork120815 күн бұрын
По поводу Дескриптора - тут можно, наверное, для более полного понятия объяснить, что descriptor - получается от слова description (описание). Таким образом descriptor можно понять как описывающий. А если более точно и по программистски, то как "указатель"... Как переменная указывает на область памяти, так и тут дескриптор указывает на какой-либо файл... Если я не прав, поправьте...
@vor675819 күн бұрын
На 19:30 вы (автор видео) отвлеклись на факт, что забыли в функцию client передать аргумент) Но вы прямо перед этим говорили о том, почему нужно добавлять в клиентский генератор в список задач, но резко переключили контекст) Поясню. Если не добавять клиентский генератор в список задач, то он повиснет в воздухе и не попадает в словарь to_read. Таким образом сервер не сможет обрабатывать клиентские запросы.
@_mrmark22 күн бұрын
Спасибо, я думал что это я такой тупой - не могу разобраться в логгировании.
@vor675825 күн бұрын
Самые классные видео про асинхронность! Было единственное недопонимание - что происходит при методе DefaultSelectors.register, откуда появляются объекты для мониторинга? Так вот, я посмотрел исходный код библиотеки selectors и обнаружил, что метод register добавляет во множество объект из параметра fileobj. А метод select уже смотрит в это множество. Просто объекты создаются тут неявным образом.
@AlexanderTaranov-c3q25 күн бұрын
Благодарю.
@МитяСоловей-з4ь28 күн бұрын
Толково объясняет автор. Респект!
@Mikayilaz10 күн бұрын
актуально сейчас?
@vor6758Ай бұрын
Лайк за акамедический стиль подачи материала!
@vladoriginkosАй бұрын
Лично я не понял, как работает select и что он вообще делает. А ведь на нём именно строится всё видео. Плюсом найти материал по этому методу крайне сложно. А в определениях, которые попадаются (и которые почти дословно совпадают с тем, что рассказал автор) в гугле, есть куча других понятий, о которых вообще слышу впервые. То ли здесь все такие умные, а я глупый, то ли им просто пофиг на понимание
@SevereTsunamistАй бұрын
Круто, спасибо! Всё четко и по полочкам
@NurakhmetDevАй бұрын
спс бро за контент
@pubgmabail3041Ай бұрын
Спасибо
@ПавелЗолотов-з9ыАй бұрын
Жду асинхроность видео два. Можно же было вместо сокетов просто запросы или бота телегрмного сделать. Но даже так, спасибо за проделанный труд.
@StarLiNe-ji5nfАй бұрын
Спасибо, очень полезно
@allonytv5831Ай бұрын
Можно следующее видео пожалуйста
@xesax2 ай бұрын
подскажите, актуально ли это сейчас? или все сильно изменили уже в asyncio?
@АндрейТаганов-ю2ь2 ай бұрын
Спасибо
@ГеоргийПанасенко-с9с2 ай бұрын
Олег, доброго времени суток. У вашего курса по ООП Python на бусти есть практическая часть? Или это теоретический материал?
@ВиталийБочкарев-р7щ2 ай бұрын
Все простым языком и доходчиво. Я бы еще в последнем задании сделал callback для записи файла. add_done_callback(callback) и в callback делал бы запись ;) Но это наверное из разряда перфекционизма :))) Идеального кода не бывает
@x056x2 ай бұрын
Потыкался я в этот киви и понял, что проще тыкать в java. Фреймворк написан так, будто какая-то поделка из нулевых. Документации код наплакал, всё перемешено с версией 1.0 (в которой к тому же синтаксис другой), разработчики в некоторых местах примеры кода кидают картинкой (!!), для простейших действий надо городить костыли. Для лайв-предпросмотра придумано вообще что-то несуразное: открыть один из официальных примеров, удалить оттуда содержимое, добавить своё, и молиться, чтобы оно всё не крашнулось, вместе с твоими наработками… цирк какой-то. Нет функций Android, к его api обращение возможно лишь через стороннюю библиотеку, то есть, фреймворк не берёт это под капот, а значит не самодостаточный и для кросс-платформенной разработки не подходит. Небольшое коммьюнити, нет перспектив. Нафиг-нафиг.
@ViyaletaChachanets2 ай бұрын
спасибо)
@Powwow2804-dw6sf2 ай бұрын
Это все ещё лучшие видео по асинку, по-крайней мере на русском. Потрясающая подача, настолько четкая мысль, что если очень постараться, то можно воспринимать на слух Хотя конечно мне лично всё ещё сложно))
@maxsavy44622 ай бұрын
Чат на django channels будет ?
@ArntorRUS2 ай бұрын
Спасибо, это лучшее объяснение генераторов, что встречал!
@Hikmatullo_charget2 ай бұрын
Наконец , я нашёл это видео ❤️🩹 , спасибо за такое полезно видео , с нетерпением ждем от вас урок создание онлайн чата используя веб сокет , спасибо огромное
@MrSunTrope2 ай бұрын
Олег, почему так часто пропадаешь?
@Butcher_DG3 ай бұрын
Олег спасибо за ваши видео , вопрос : Python востребован ? или лучше учить Go.
@Вадим-н1н7в3 ай бұрын
Спасибо, пока все понятно вроде бы
@__Feniks__3 ай бұрын
бляяять, ну как можно рекомендовать vim ну это же пздц, это как предлагать юзеру линукс вместо виндовс
@jadrezz.g3 ай бұрын
Отлично, очень хорошо укладывается в голове после таких объяснений. Молодец
@RatchetTV15153 ай бұрын
Можно бесконечный генератор сделать через cycle из itertools
@ElvenDen3 ай бұрын
Спасибо
@АндрейГуз-ц3м3 ай бұрын
странно что так мало лайков
@ElvenDen3 ай бұрын
Спасибо
@АндрейГуз-ц3м3 ай бұрын
kzbin.info/www/bejne/qou8Y2lmit50n6c =))
@xmxustin3 ай бұрын
Коммент для поддержки и продвижения. Спасибо, бро
@РемонтКрупнойБытовойТехникивВо3 ай бұрын
Здравствуйте увидел у вас комментарий по поводу ремонтов кофемашин крупс подскажите как с вами связаться уточнить некоторые детали
@АнтонГоленев3 ай бұрын
Лучшее объяснение генераторов, которое я видел
@МаксимНовиков-ь4ц3 ай бұрын
Просто объяснил про мощный инструмент. Берём на вооружение.
@TheEBPO4 ай бұрын
Крутой курс по базе асинк, Спасибо!
@TheEBPO4 ай бұрын
Сложно было для понимания... Но пересмотреть пару раз и все ок. Спасибо!
@TheEBPO4 ай бұрын
На счет пункта (3. Все очень долго, сложно, неинтересно и непонятно.) Не соглашусь =)) Долго, сложно, Интересно! и понятно! Понятно и интересно благодаря тебе, спасибо!
@TheEBPO4 ай бұрын
Вопрос! Если мы все равно использовали select() зачем использовать остальную надстройку из yield? Разве она дает какие-то преимущества? Спасибо!