Тёмный

Основы асинхронности в Python #2: Асинхронность с простыми функциями. Событийный цикл. 

Oleg Molchanov
Подписаться 79 тыс.
Просмотров 101 тыс.
50% 1

Мои курсы:
Boosty:
boosty.to/omol...
Patreon:
/ karty-vsekh-41011404
Основы асинхронности в Python для начинающих, она же "кооперативная многозадачность".
Речь в этой серии пойдет о коде, который асинхронно выполняется в одном потоке и в одном процессе.
В этом видео:
Рефакторим код предыдущего примера так, чтобы у нас появилась возможность в принципе выполнять его асинхронно.
Создаем простейший событийный цикл (Event Loop) и знакомимся с функцией select().
Ключевые моменты этого видео - рефакторинг кода для его последующего асинхронного выполнения и создание событийного цикла.
** ИСХОДНЫЙ КОД **
Основных проектов доступен в Patreon:
/ iskhodnyi-kod-26640469
***
🔷 Для донатов. Всегда очень признателен за это:
www.donational...
Весь плейлист:
Основы асинхронности в Python #1: Введение
• Основы асинхронности в...
Основы асинхронности в Python #2: Асинхронность с простыми функциями. Событийный цикл.
• Основы асинхронности в...
Основы асинхронности в Python #3: Асинхронность на колбэках.
• Основы асинхронности в...
Основы асинхронности в Python #4: Генераторы и событийный цикл Round Robin
• Основы асинхронности в...
Основы асинхронности в Python #5: Асинхронность на генераторах
• Основы асинхронности в...
Основы асинхронности в Python #6: Корутины и yield from
• Основы асинхронности в...
Основы асинхронности в Python #7: Asyncio, async/await
• Основы асинхронности в...

Опубликовано:

 

24 сен 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 189   
@zencrazycat
@zencrazycat 4 года назад
"Он будет настолько простым, что, мне кажется, создать что нибудь ещё проще будет не так то уж просто."©
@sergeystepanov4261
@sergeystepanov4261 3 года назад
Объяснять асинхронность на примере сокетов, где 90% времени и сложности заключена именно в сокетах. Ловко ты это придумал. Молодец.
@bambimbambas
@bambimbambas 2 года назад
+
@acalabash
@acalabash 2 года назад
Отличное видео! Только одна маленькая проблема - код 1_select.py падает при закрытии соединения клиентом. Естественно, это незначительная проблема для такой игрушечной программы (к тому же призванной демонстрировать механику), но если вдруг кому-то интересно, в чем дело и как это исправить, то читайте: Основной цикл в функции event_loop на каждой итерации ждет появления каких-либо данных для чтения в сокетах. Если сокет закрыт, то значение его fd принимает отрицательное значение (в моей системе -1), и при попытке его проверки select выбрасывает ошибку. Чтобы избежать этого, нужно закрытый сокет сразу же убирать из списка to_monitor, например, так: to_monitor.remove(client_socket)
@acalabash
@acalabash Год назад
@@firstandlast4435 питон очень удобно кодирует такое сообщение как пустую байтовую строку (b''), которая в выражении if not request оценивается, как булево False. Так мы и рвем внутренний цикл и переходим в основной, чтобы ждать следующее соединение
@RedEyedCoderClub
@RedEyedCoderClub Год назад
@@firstandlast4435 это значит, что я остановил работу клиента. Нажал Ctrl+C
@Сергей-ф2ъ7я
@Сергей-ф2ъ7я 11 месяцев назад
этот код запускали 10 человек)
@ДмитрийН-т1ц
@ДмитрийН-т1ц 5 лет назад
Как же круто! Просто находка, супер материал! С самого начала смотрю канал и каждый раз в восторге
@zaemiel
@zaemiel 5 лет назад
Следующее видео будет опубликовано 8-го декабря в субботу. Хочу обратить ваше внимание, что в описании к видео есть план серии. И про asyncio и про async/await тоже будет.
@vitproff2
@vitproff2 5 лет назад
Отпишите пожалуйста можно ли использовать асинхронность при парсинге сайтов и записи данных при парсинге в файл? Если можно то опишите коротко как это можно сделать. Спасибо за отличные уроки!
@zaemiel
@zaemiel 5 лет назад
Асинхронность при парсинге использовать можно. Но нормальные серверы за такое банят, приходится замедлять парсинг. "Весь Python за 7 легких уроков" - это не ко мне, поэтому описать это коротко не смогу.
@vitproff2
@vitproff2 5 лет назад
@@zaemiel Спасибо за ответ!
@unaibekovbakhyt6517
@unaibekovbakhyt6517 5 лет назад
Классно, желаю удачи, неиссякаемого энтузиазма и много денег)
@sainco3036
@sainco3036 5 лет назад
@@zaemiel Привет Олег, давно предлагал тебе сделать цикл обучающих видеоуроков по Python 3, с твоей подачей будет топ на ютубе.
@vladimirk941
@vladimirk941 4 года назад
Большое спасибо, что автор не мычит и не экает. Приятно слушать. Лайк, рекомендую.
@cybernation498
@cybernation498 4 года назад
Олег, спасибо) Ни одни курсы МФТИ так подробно и понятно не объясняют. Думаю, наконец устраню свой пробел в async)
@TheDavBag
@TheDavBag 5 лет назад
чувак, очень круто! прям прёт, без шуток очень, рад , что нашел этот канал - поделился с коллегами на работе
@6E3KOMAPOB
@6E3KOMAPOB 5 лет назад
Нет никаких сомнений что этот канал выстрелит! Подача, разбор нюансов, на высоте! Есть ощущение, что Вы можете сделать цельный курс по Python3. С коммерческой точки зрения проекту светит взлет. И как благодарность за Ваш труд задонатил!
@zaemiel
@zaemiel 5 лет назад
Спасибо вам огромное за донаты!
@stepanzh
@stepanzh 5 лет назад
При закрытии сокета ведь нужно чистить список to_monitor?
@zaemiel
@zaemiel 5 лет назад
да, нужно. Я забыл сказать про этот момент. В 3-ем видео будет уже все нормально. Просто добавьте в блок else функции send_message() перед закрытием сокета: to_monitor.remove(client_socket)
@ЕркебуланБусурманов-ц6щ
Приятный, спокойный голос и подробные обьяснения! Спасибо!
@nonpiramid
@nonpiramid 3 года назад
Одно из полезнейших видео, просмотренных мной в жизни
@sergeyshevtsov5125
@sergeyshevtsov5125 5 лет назад
Классно было увидеть и понять имплементацию event loop, на этом принципе построены все браузеры, ну и не только они. Спасибо!
@Streonix
@Streonix 4 года назад
огромное спасибо за качественную подачу! единственный вопрос, который остаётся после просмотра - "кто те люди, что ставят дизлайк?"
@myroslavyelechko114
@myroslavyelechko114 Месяц назад
Для проверки готов ли для чтения сокет, можно использовать не только select, как было сказано в видео. Если рассмотреть подход с неблокироющем I/O, то его можно сделать без доп. методов операционки(select), и использовать только сами сокеты.
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil 2 года назад
00:00 Вынос в функции кода предыдущего примера 03:25 Описание переделки в асинхронный код 06:38 Переделка в асинхронный код. Функция select 16:22 Прогон примера
@kalik54
@kalik54 4 года назад
Хорошо обьяснил, у тебя единственный понятный курс по этой теме, спасибо
@Максим-т5ш8и
@Максим-т5ш8и Год назад
Очень крутой материал. Асинхронность для себя открыл на днях. Сначала непонятно, а потом как все понял :)
@wh1te_s0ul
@wh1te_s0ul 3 года назад
Дружище, это очень крутой и понятный материал. Просто пушка, так держать! P.S. Не понимаю почему так мало подписоты и лукасов
@Katar1x
@Katar1x 2 года назад
тема сложная
@mahvasya
@mahvasya 4 года назад
Очень круто! Системно, лаконично, доступно! Зачем после этих видео люди записывают что-то про основы асинхрона? Можно же смело отправлять сюда.
@MrNagios
@MrNagios 5 лет назад
мне надо несколько раз пересмотреть, в т.ч. и старые ролики, что бы это понять... Спасибо большое за работу.
@imgnl
@imgnl 5 лет назад
Спасибо, Олег!
@АртемПоляков-н7б
@АртемПоляков-н7б 3 года назад
ни одного канала про питон лучше чем у тебя не нашел
@ЗилогЗилогович
@ЗилогЗилогович 5 лет назад
Спасибо за годноту. хотел в напомнить про удаление клиентского сокета из списка наблюдения и закрытие серверного, но старшие товарищи уже отписались, да и не это важно в данном уроке.
@zaemiel
@zaemiel 5 лет назад
да, было дело. Вроде уже удалял сокет из наблюдения, не? Или это было в следующем видео... Не помню.
@ilyachudakov7944
@ilyachudakov7944 2 года назад
Олег, спасибо за труд! Очень интересно рассказываете!
@slonbeskonechen8310
@slonbeskonechen8310 2 года назад
Отлично! Четко, внятно, понятно! СПАСИБО!!!
@jackmetropolitan7845
@jackmetropolitan7845 2 года назад
Олег, это очень, ОЧЕНЬ круто, спасибо!
@maksimrus4326
@maksimrus4326 4 года назад
Олег Молчанов, Вы определенно шарите !)
@IlyaLeontyev
@IlyaLeontyev Год назад
Благодарствую за классное видео!
@ivnfrol6309
@ivnfrol6309 5 лет назад
Благодарю за работу и старания! Обожаю твой канал и жду новый ценный материал!
@ГригорийКелехсаев
Гениальное объяснение.
@caiman101
@caiman101 3 года назад
Здравия и благодати!
@QWEqaz123ification
@QWEqaz123ification 3 года назад
Офигенно. Спасибо большое за такой крутой контент.
@bignah4872
@bignah4872 5 месяцев назад
и я тоже понял, спасибо вам!
@РинатБаранкулов
@РинатБаранкулов 2 года назад
все понятно и доступно объяснил. спасибо
@andredru4278
@andredru4278 Год назад
Спасибо. Все понятно объяснено.
@Сулейман-с3у
@Сулейман-с3у 2 года назад
тяжело для моего мозга, но после стараний все понимаю, спасибо
@hybridjunkie456
@hybridjunkie456 5 лет назад
Спасибо за ваши полезные видео)
@chimchimsterschannel161
@chimchimsterschannel161 Год назад
Супер видео. Спасибо!
@Прилуки_Класичні
@Прилуки_Класичні 3 года назад
Олег, большое спасибо вам за видео! Все очень понятно и без воды. Скажите, пожалуйста, а список to_monitor в таком случае не будет переполняться ненужными закрытыми клиентскими сокетами? Может их после .close() удалять из списка по значению?
@checkerchess123
@checkerchess123 5 лет назад
Вы лучший. Спасибо вам большое.
@w1erley
@w1erley 3 года назад
первый раз когда воды нету, топ чел
@НиколайКочкин-в8с
Все по полочкам😎
@KikrAzz
@KikrAzz Год назад
отличное видео! всем рекомендую!
@ЕрвандАгаджанян-в3к
Спасибо огромное! Потрясающе))
@igorkulibaba7287
@igorkulibaba7287 5 лет назад
Спасибо , очень профессионально. Если можно чутахи шрифт побольше. На мобильнике тяжковато разглядеть.
@zaemiel
@zaemiel 5 лет назад
Просто смотреть бесполезно, пустая трата времени. Это все нужно прорабатывать.
@johnmcway6120
@johnmcway6120 3 года назад
@@zaemiel Может голос твой приятен человеку вот. Удовольствие своего рода же. Зря ты так.
@XACKDante
@XACKDante 4 года назад
Большое спасибо за видео!
@alexanderk.4701
@alexanderk.4701 Год назад
Олег, Ты oxyительный! Я твой фанат!
@ИльяТулин-ц8р
@ИльяТулин-ц8р 3 года назад
Класс, спасибо за объяснение, но есть один момент, если гасишь одного клиента, ложится весь сервак
@zergdeveloper9227
@zergdeveloper9227 2 года назад
Спасибо за видео)
@cardinalerror1
@cardinalerror1 2 года назад
На Python 3.9 сравнение if sock is server_socket перестало работать, как предполагалось - из-за этого пример не получается запустить. Я исправил на if id(sock) == id(server_socket), с такой редакцией код заработал. Windows 10 c ncat
@kleget
@kleget 2 года назад
СПАСИБО ТЕБЕ ОГРОМНОЕ!
@awdawdawdbfw
@awdawdawdbfw Год назад
is это и так сравнение по id
@TeppopucT
@TeppopucT 5 лет назад
Огромное спасибо. Только теперь получается, что асинхронность это большой обман и, на самом деле, это таже последовательность но крупные задачи разбили на мелкие. И результат скармливают по чуть-чуть каждому, чтобы не думали что о них забыли.
@zaemiel
@zaemiel 5 лет назад
асинхронность - это не обман
@garrygaller2853
@garrygaller2853 4 года назад
"асинхронность - это не обман". Выше автор ответил. И он прав, потому что истинной параллельности на одном CPU вообще не существует. CPU, если вы не знали, всегда играет в пошаговую стратегию.
@kuksinsky
@kuksinsky 2 года назад
@@garrygaller2853 точнее будет сказать "не существует на одном ядре", но т.к. сейчас много ядер в CPU, то итинная параллельность все таки существует.
@andreybelyaev5703
@andreybelyaev5703 3 года назад
Супер!
@aryji4864
@aryji4864 3 года назад
У кого проблема: ValueError: file descriptor cannot be a negative integer (-1) Просто удалите server_socket.close() из send_mess :-)
@vladsoldatenko8561
@vladsoldatenko8561 2 года назад
И??? В идеале, сокет сервера же повиснет, если его не закрыть. Кагбэ тут не сервер-сокет надо закрывать, а клиент-сокет, а если закрывать client_socket, то его надо удалять из списка to_monitor Upd: думаю, для того чтобы этой ошибки не было - цикл while в функции event_loop надо, например, обернуть код цикла в конструкцию try - except.
@RoTor_Ex
@RoTor_Ex 2 года назад
Проверь не забыл ли ты убрать not перед request в блоке if функции send_message
@SAVSAV1212
@SAVSAV1212 4 месяца назад
@@RoTor_ExСпасибо, а то я в недоумении был, почему у меня клиент не может соединиться. Оказывается ему на каждой итерации закрывают сокет)
@sainco3036
@sainco3036 5 лет назад
Спасибо за видос.
@radura942
@radura942 Год назад
Я правильно понял что функция select является блокирующей в event_loop?
@dukalow
@dukalow 5 лет назад
Спасибо
@Dm-if3vl
@Dm-if3vl 4 года назад
Спасибо!
@noname1999x
@noname1999x 3 года назад
Жаль я не видел этого видео когда писал игровой сервак на плюсах, понятнее видео по select на русскоязычном ютубе не видел 🔥
@ReusN
@ReusN 5 лет назад
Оо видосик)) спасибо
@MrJet84
@MrJet84 Год назад
Не сразу это понял. Вдруг кому-то это сэкономит время: "готовый к чтению" - это означает, что в нем есть новое что прочитать!
@АлександрВалерьевич-ц6щ
Это и есть асинхронность в питоне? Насколько я понял вызовы ЛУУПа выполняются не паралельно а все равно последовательно, просто в бесконечном цикле? Да и обе функции остались блокирующими просто отрабатывают логику и возвращают управление в цикл? А главная блокирующая - ready_to_read = select()
@vskovzgird
@vskovzgird 4 года назад
Единственная непонятная здесь вещь это select. Ну, ну. С сокетами мы конечно все поняли.
@wisefriend1162
@wisefriend1162 5 лет назад
Олег, спасибо за видео, надеюсь будет отдельное видео c использованием async, await?
@zaemiel
@zaemiel 5 лет назад
Если вы загляните в описание к видео, то вы увидите план серии. Да, будет и про async/await.
@zaemiel
@zaemiel 5 лет назад
На самом деле ирония ситуации заключается в том, что это и есть про asyncio и про async/await. Каждое видео в этой серии этому посвящено. Проблема-то в том, что вы ищите волшебную красную таблетку аля "Весь Python за7 легких уроков", которая позволила бы вам без усилий, за очень короткое время понять эти дико сложные концепции. Легкого пути нет. Волшебной таблетки тоже нет. Все очень долго, скучно и непонятно.
@ПавелОсипенко-ч2е
@@zaemiel Долго? Да, скучно - это кому как. Я думаю кому скучно, те не смотрят и не учатся. А те. кто смотрит, вряд ли им скучно. Мне, например очень даже интересно! Непонятно? - Есть в некоторых местах. Но опять-таки, кто хочет, тот разберется и поймет. Тем более с такой подачей материала ! Олег, спасибо за то, что так доступно и разжовано! Твои видео для меня реально находка...
@vrabosh
@vrabosh 4 года назад
Круто.
@sed4tive682
@sed4tive682 5 месяцев назад
Правильно ли я понимаю, что список ready to read все время пустой, до момента, пока пользователь не напишет сообщение или не подключится? 1 момент. Если пользователь подключается, то серверный сокет становится доступным для чтения и помещается в ready_to_read? 2 момент. Если пользователь отправляет сообщение, то клиентский сокет становится доступным для чтения и помещается в ready_to_read?
@kozlovsky5692
@kozlovsky5692 5 лет назад
Класс
@youarenotmygoal4890
@youarenotmygoal4890 3 года назад
Отчего эта ошибка возникает, когда запускаю ваше приложение? ValueError: file descriptor cannot be a negative integer(-1)
@СергейЧистяков-ь2х
Это уроки для профи !
@kelevra1493
@kelevra1493 2 года назад
Немного непонятно, в каких случаях срабатывает: ``` else: print("close client socket") client_socket.close() ```
@fear4970
@fear4970 Год назад
Думаю не актуально, но для тех кто будет смотреть это видео в будущем, будет полезно. У нас условие if request , если оно будет пустым (просто нажать enter в терминале), тогда подключение закроется
@ДмитрийСиницкий-р2щ
fire!
@cassiusclay963
@cassiusclay963 Месяц назад
Честно говоря мне многое не понятно. Я так понял, что server_socket, не откроет новое соединение с новым клиентом, пока старое не будет закрыто, в этом и есть суть, почему это блокирующая функция. Так каким же образом server_socket может в этом примере открывать сколько угодно новых соединений. Или я что-то неправильно понял?🤔
@midzakikayo2831
@midzakikayo2831 3 года назад
Материал отличный. Но такой вопрос продублировал код а в итоге ``` ready_to_read, _, _ = select(to_monitoring, [], []) ValueError: file descriptor cannot be a negative integer (-1) ``` Может быть такое связано с форточкой?
@guiterenzog2723
@guiterenzog2723 Год назад
Если честно, не совсем понял, каким образом перенос логики в event_loop меняет суть самих блокирующих функций. По сути, если функция блокирует дальнейшее выполнение кода, программа должна "зависнуть" в ожидании сообщения, но уже не в цикле while, а внутри условного recv. Почему это все-таки не так? Посидел, обдумал. Достигается за счет того, что блокирующие функции вызываются только в тот момент, когда для них есть действие, которое сразу снимает блокировку, верно?
@invincible253
@invincible253 Год назад
Получается, уже не блокирующие, т.к вызываются только когда от них есть, что получить
@ара_вася
@ара_вася 2 года назад
Для новичков очень понятно, проще некуда. Чтобы понять одну хрень автор нагрузил в ролик кучу другой непонятной хрени
@user-wu3vd7dd2r
@user-wu3vd7dd2r 3 года назад
вопрос по поведению selecta при разрыве одного из соединений в to_monitor. Он начнёт игнорировать невалидный дескриптор или свалится?
@FieldmarshalDoob
@FieldmarshalDoob 5 лет назад
Я правильно понял что данный код будет корректно работать только на Unix'ах?
@zaemiel
@zaemiel 5 лет назад
нет, не правильно. Я этого не говорил.
@mmilerngruppe
@mmilerngruppe 4 года назад
правильно ли я понимаю, что в to_monitor будут накапливаться и уже закрытые соединения?
@Андрей-т6в8п
@Андрей-т6в8п 5 лет назад
А не надо удалять сокеты из to_monitor после закрытия соединения? И закрывать server_socket в конце?
@felix30ua
@felix30ua 5 лет назад
server_socket там 1шт на всех ;)
@Андрей-т6в8п
@Андрей-т6в8п 5 лет назад
Это понятно, но я думал, что его перед выходом из программы тоже надо закрывать. Хотя, возможно, из-за 6 строки это не обязательно
@zaemiel
@zaemiel 5 лет назад
закройте, конечно. Но это не основной момент.
@nordost8
@nordost8 5 лет назад
Событийный цикл должен быть 1 на всю программу или в каждой её части отдельный? Например если я принимаю запрос от пользователя и прогоняю его через большой набор классов, в которых есть методы, я должен в каждом классе делать подобный event loop? (естественно если методы класса подходят для асинхронного выполнения)
@zaemiel
@zaemiel 5 лет назад
Событийный цикл должен быть только один
@dbte5
@dbte5 Год назад
Видно, что несложно, но нужно изначальное понимает сокетов, селекта и т.д.
@TheKzfor
@TheKzfor 4 года назад
а почему if sock is server_socket возвращает True?
@googleadmin4749
@googleadmin4749 11 месяцев назад
Как напёрсточник, хотел про асинхронность, а в итоге два видео без единой строчки асинхронного кода 😂
@zaemiel
@zaemiel 11 месяцев назад
эх был у меня закрепленный коммент на эту тему и я его изменил. Словом это все про асинхронность и я это наглядно демонстрирую. Но вы можете отписаться от канала в любой момент и выбрать в меньшке ютуба "Не рекоммендовать с этого канала". Делов-то.
@zaemiel
@zaemiel 11 месяцев назад
а я нашел этот коммент. Прочитайте закрепленный комментарий к 4-му видео этой серии: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-PjZUSSkGLE8.html
@andrselt2274
@andrselt2274 4 года назад
Что за конструкция if sock is server_socket что за is ? это равносильно: if sock == server_socket ?
@zaemiel
@zaemiel 4 года назад
Похоже, но не равносильно. is - сравнивает сами объекты, а не значения
@andrselt2274
@andrselt2274 4 года назад
@@zaemiel Спасибо! Почитаю в интернете.
@lt197
@lt197 4 года назад
А почему мы в select() передаем клиентский сокет в списке для проверки на чтение? Я почему то был свято уверен, что вы его положите в список для проверки на запись. Ну, дескать, сервер, который исполняет скрипт мониторит свой сокет на чтение, куда прилетит сообщение от пользователя и сокет клиента на возможность записи, ведь серверу нужно записать туда ответ, разве нет?
@falconawp703
@falconawp703 4 года назад
Нам прилетает задача, которую нужно прочитать, поэтому на чтение
@ЩалаАшала
@ЩалаАшала 5 лет назад
Кто-нибудь может подсказать что эта за ошибка ValueError: file descriptor cannot be a negative integer (-1)
@mrsanchez860
@mrsanchez860 5 лет назад
у меня возникла такая же проблема, решения пока что не нашел(
@rainbowVax
@rainbowVax 5 лет назад
@@mrsanchez860 под client_socket.close() нужно дописать to_monitor.remove(client_socket)
@Anklav24
@Anklav24 3 года назад
Кто на Windows 10 запускайте через WSL иначе не будет работать)
@ПавелВладимировичАнохин
Почему на 11:46 мы не создаём список to_monitor сразу с объектом server_socket, а добавляем объект в цикле? Вопрос выбора автора или принципиальное правило?
@Hagen11rus
@Hagen11rus 2 года назад
что из себя представляет if __name__ == '__main__' знаете?
@ПавелВладимировичАнохин
@@Hagen11rus функция, выполнение которой начинается, если был запущен именно данный модуль?
@andreipopov2700
@andreipopov2700 4 года назад
👍🏻
@gpankov
@gpankov Год назад
Я так и не понял почему в в список to_monitor передаем server_socket
@gpankov
@gpankov Год назад
ну хорошо, я понял мы туда передаем объект, у которого есть метод .fileno, но как я должен понять что у объекта есть такой метод, а если нет? А если я просто чат бота делаю, как с помощью селекта запускать функции в ивентлупе?
@deniscypukat4377
@deniscypukat4377 5 лет назад
Было бы весьма удобно так же получить "исходники" из примеров, для более удобного освоения.
@zaemiel
@zaemiel 5 лет назад
Знание - через делание.
@deniscypukat4377
@deniscypukat4377 5 лет назад
@@zaemiel разумеется, но простое перепечатывание редко помогает. А вот взять код, натыкать точек остановок, посмотреть, что происходит, потом пересмотреть видео - гораздо более эффективно. На самом деле, пример ну прямо отсюда docs.python.org/3/library/selectors.html
@deniscypukat4377
@deniscypukat4377 5 лет назад
ой... не к тому видео))) К следующему))
@zaemiel
@zaemiel 5 лет назад
практически да, но не совсем, как видите. По работе с selectors - это самый базовый вариант.
@ПавелОсипенко-ч2е
@@deniscypukat4377 а еще более эффективно - после просмотра видео, повторить все это вручную, так же пошагово и обьяснять себе самому (или коту или утке, есть такой метод) все что делаеш. И вот тогда всплывет то, что не усвоилось. Потом пойдет пересмотр этих моментов и в итоге прийдет понимание того, для чего каждая конкретная строка кода и почему она здесь а не где-то там. Проверенный метод. Долго, но зато потом все на своих полочках и выуживается из головы так же легко как это у Олега, прям на одном дыхании :)
@indominusmonster6433
@indominusmonster6433 Год назад
не работает, говорит что не может использовать список с пинус первым индексом
@zaemiel
@zaemiel Год назад
работает. Проверяте ваш код
@andreypr503
@andreypr503 2 года назад
На самом деле это не в одном потоке выполняется, в нутри select запускаются потоки тоже самое можно было сделать с помощью threading и самим мониторить сокет на доступность, но тогда магия теряется, а так кручу верчу запуть хочу
@zaemiel
@zaemiel 2 года назад
Это выполняется в одном потоке. Суть всей серии в том, чтобы не использовать threading.
@andreynezametin1679
@andreynezametin1679 8 месяцев назад
@@zaemiel А как можно сделать асинхронным код, не используя многопоточность или прерывание?😚 второе современные ос не дадут сделать, только на уровне api ос. Ну а если объективно, то данный пример, который у Вас - он по прежнему содержит блокирующие функции, если увеличить объем recv, и отправлять в ответ клиенту файл например, то он так же будет блокировать всю программу.
@alexanderbrusilov2935
@alexanderbrusilov2935 5 лет назад
Если на клиенте нажать CTRL-C, то сервер выдает ошибку Traceback (most recent call last): File "./1-5_select.py", line 40, in event_loop() File "./1-5_select.py", line 31, in event_loop ready_to_read, _, _ = select(to_monitor, [], []) ValueError: file descriptor cannot be a negative integer (-1) Подскажите, пожалуйста, как это исправить.
@ВасилийБигачёв
@ВасилийБигачёв 4 года назад
у тебя в to_monitor остаются клиенты, которые уже отключены
@mikakost
@mikakost 5 лет назад
У меня не принял второго клиента, только после отключения первого. Код проверил, как в видео Это ограничения Windows 7 / telnet ?
@HungrFenrir
@HungrFenrir 4 года назад
Нет, у меня всё работает на w7 + telnet. Проверяйте код. (Уже наверное неактуально, оставляю для тех, у кого такая же проблема)
@SAVSAV1212
@SAVSAV1212 4 месяца назад
На Ubuntu/telnet тоже работает
@maydjin
@maydjin 2 года назад
Лучше бы вернуть сокет из accept_connection, чем делать сайд эффект на глобальное состояние.
@xstratumm
@xstratumm 5 лет назад
Что за подсветка синтаксиса? Sublime Monokai?
@zaemiel
@zaemiel 5 лет назад
Я использую Atom. И да это немного измененная тема Monokai: github.com/kevinsawicki/monokai
@ealbitg1043
@ealbitg1043 4 года назад
Это сработает, даже если одновременно два клиента направят request?
@zaemiel
@zaemiel 4 года назад
вы видео не смотрели штоль?
@Krasnolesye
@Krasnolesye 3 года назад
@@zaemiel На видео, запросы отправляют 2 клиента, но последовательно. Его интересовало - если одновременно
@funreal8727
@funreal8727 3 года назад
2:30 ачепятка
@artemqqq7153
@artemqqq7153 Год назад
Сложно понять конечно, не зная сокетов
Далее
Китайка нашла Новый Дом😂😆
00:20
Ничего не делаю всё видео 😴
00:33
Please Help This Poor Boy 🙏
00:40
Просмотров 3,4 млн
Основы Asyncio
53:25
Просмотров 20 тыс.