Тёмный

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

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

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

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

 

4 дек 2018

Поделиться:

Ссылка:

Скачать:

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

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 187   
@zencrazycat
@zencrazycat 3 года назад
"Он будет настолько простым, что, мне кажется, создать что нибудь ещё проще будет не так то уж просто."©
@sergeystepanov4261
@sergeystepanov4261 2 года назад
Объяснять асинхронность на примере сокетов, где 90% времени и сложности заключена именно в сокетах. Ловко ты это придумал. Молодец.
@bambimbambas
@bambimbambas 2 года назад
+
@user-xs9um4zf8r
@user-xs9um4zf8r 5 лет назад
Как же круто! Просто находка, супер материал! С самого начала смотрю канал и каждый раз в восторге
@vladimirk941
@vladimirk941 3 года назад
Большое спасибо, что автор не мычит и не экает. Приятно слушать. Лайк, рекомендую.
@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, с твоей подачей будет топ на ютубе.
@acalabash
@acalabash Год назад
Отличное видео! Только одна маленькая проблема - код 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
@user-nl4ps9rm9o
@user-nl4ps9rm9o 8 месяцев назад
этот код запускали 10 человек)
@cybernation498
@cybernation498 4 года назад
Олег, спасибо) Ни одни курсы МФТИ так подробно и понятно не объясняют. Думаю, наконец устраню свой пробел в async)
@TheDavBag
@TheDavBag 5 лет назад
чувак, очень круто! прям прёт, без шуток очень, рад , что нашел этот канал - поделился с коллегами на работе
@6E3KOMAPOB
@6E3KOMAPOB 5 лет назад
Нет никаких сомнений что этот канал выстрелит! Подача, разбор нюансов, на высоте! Есть ощущение, что Вы можете сделать цельный курс по Python3. С коммерческой точки зрения проекту светит взлет. И как благодарность за Ваш труд задонатил!
@zaemiel
@zaemiel 5 лет назад
Спасибо вам огромное за донаты!
@ilyachudakov7944
@ilyachudakov7944 2 года назад
Олег, спасибо за труд! Очень интересно рассказываете!
@ivnfrol6309
@ivnfrol6309 5 лет назад
Благодарю за работу и старания! Обожаю твой канал и жду новый ценный материал!
@user-ed4gb6wy3r
@user-ed4gb6wy3r 3 года назад
Приятный, спокойный голос и подробные обьяснения! Спасибо!
@kalik54
@kalik54 4 года назад
Хорошо обьяснил, у тебя единственный понятный курс по этой теме, спасибо
@jackmetropolitan7845
@jackmetropolitan7845 2 года назад
Олег, это очень, ОЧЕНЬ круто, спасибо!
@nonpiramid
@nonpiramid 3 года назад
Одно из полезнейших видео, просмотренных мной в жизни
@sergeyshevtsov5125
@sergeyshevtsov5125 5 лет назад
Классно было увидеть и понять имплементацию event loop, на этом принципе построены все браузеры, ну и не только они. Спасибо!
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil 2 года назад
00:00 Вынос в функции кода предыдущего примера 03:25 Описание переделки в асинхронный код 06:38 Переделка в асинхронный код. Функция select 16:22 Прогон примера
@stepanzh
@stepanzh 5 лет назад
При закрытии сокета ведь нужно чистить список to_monitor?
@zaemiel
@zaemiel 5 лет назад
да, нужно. Я забыл сказать про этот момент. В 3-ем видео будет уже все нормально. Просто добавьте в блок else функции send_message() перед закрытием сокета: to_monitor.remove(client_socket)
@imgnl
@imgnl 5 лет назад
Спасибо, Олег!
@slonbeskonechen8310
@slonbeskonechen8310 2 года назад
Отлично! Четко, внятно, понятно! СПАСИБО!!!
@QWEqaz123ification
@QWEqaz123ification 3 года назад
Офигенно. Спасибо большое за такой крутой контент.
@user-qn6pq1dk5h
@user-qn6pq1dk5h Год назад
Очень крутой материал. Асинхронность для себя открыл на днях. Сначала непонятно, а потом как все понял :)
@MrNagios
@MrNagios 5 лет назад
мне надо несколько раз пересмотреть, в т.ч. и старые ролики, что бы это понять... Спасибо большое за работу.
@Streonix
@Streonix 4 года назад
огромное спасибо за качественную подачу! единственный вопрос, который остаётся после просмотра - "кто те люди, что ставят дизлайк?"
@hybridjunkie456
@hybridjunkie456 5 лет назад
Спасибо за ваши полезные видео)
@mahvasya
@mahvasya 4 года назад
Очень круто! Системно, лаконично, доступно! Зачем после этих видео люди записывают что-то про основы асинхрона? Можно же смело отправлять сюда.
@user-uc3wv8pb1p
@user-uc3wv8pb1p 2 года назад
Гениальное объяснение.
@maksimrus4326
@maksimrus4326 4 года назад
Олег Молчанов, Вы определенно шарите !)
@sergeygimonov2761
@sergeygimonov2761 5 лет назад
Вы лучший. Спасибо вам большое.
@user-qx4qo6iv9v
@user-qx4qo6iv9v 2 года назад
все понятно и доступно объяснил. спасибо
@user-xe3zv5rk7u
@user-xe3zv5rk7u 3 года назад
ни одного канала про питон лучше чем у тебя не нашел
@IlyaLeontyev
@IlyaLeontyev 9 месяцев назад
Благодарствую за классное видео!
@caiman101
@caiman101 3 года назад
Здравия и благодати!
@user-ee1lx1pe7n
@user-ee1lx1pe7n 2 года назад
Спасибо огромное! Потрясающе))
@XACKDante
@XACKDante 4 года назад
Большое спасибо за видео!
@wh1te_s0ul
@wh1te_s0ul 3 года назад
Дружище, это очень крутой и понятный материал. Просто пушка, так держать! P.S. Не понимаю почему так мало подписоты и лукасов
@Katar1x
@Katar1x Год назад
тема сложная
@andredru4278
@andredru4278 9 месяцев назад
Спасибо. Все понятно объяснено.
@chimchimsterschannel161
@chimchimsterschannel161 Год назад
Супер видео. Спасибо!
@KikrAzz
@KikrAzz Год назад
отличное видео! всем рекомендую!
@sainco3036
@sainco3036 5 лет назад
Спасибо за видос.
@hackdivision
@hackdivision 3 года назад
Олег, большое спасибо вам за видео! Все очень понятно и без воды. Скажите, пожалуйста, а список to_monitor в таком случае не будет переполняться ненужными закрытыми клиентскими сокетами? Может их после .close() удалять из списка по значению?
@zergdeveloper9227
@zergdeveloper9227 2 года назад
Спасибо за видео)
@user-fk4ef5jz5k
@user-fk4ef5jz5k 4 года назад
Спасибо за годноту. хотел в напомнить про удаление клиентского сокета из списка наблюдения и закрытие серверного, но старшие товарищи уже отписались, да и не это важно в данном уроке.
@zaemiel
@zaemiel 4 года назад
да, было дело. Вроде уже удалял сокет из наблюдения, не? Или это было в следующем видео... Не помню.
@user-tc2pt7ep7e
@user-tc2pt7ep7e Год назад
Все по полочкам😎
@bignah4872
@bignah4872 Месяц назад
и я тоже понял, спасибо вам!
@andreybelyaev5703
@andreybelyaev5703 3 года назад
Супер!
@w1erley
@w1erley 3 года назад
первый раз когда воды нету, топ чел
@user-xc9no9hd4i
@user-xc9no9hd4i 2 года назад
тяжело для моего мозга, но после стараний все понимаю, спасибо
@svrd-tech
@svrd-tech 5 лет назад
Спасибо!
@alexanderk.4701
@alexanderk.4701 10 месяцев назад
Олег, Ты oxyительный! Я твой фанат!
@ReusN
@ReusN 5 лет назад
Оо видосик)) спасибо
@dukalow
@dukalow 5 лет назад
Спасибо
@wisefriend1162
@wisefriend1162 5 лет назад
Олег, спасибо за видео, надеюсь будет отдельное видео c использованием async, await?
@zaemiel
@zaemiel 5 лет назад
Если вы загляните в описание к видео, то вы увидите план серии. Да, будет и про async/await.
@zaemiel
@zaemiel 5 лет назад
На самом деле ирония ситуации заключается в том, что это и есть про asyncio и про async/await. Каждое видео в этой серии этому посвящено. Проблема-то в том, что вы ищите волшебную красную таблетку аля "Весь Python за7 легких уроков", которая позволила бы вам без усилий, за очень короткое время понять эти дико сложные концепции. Легкого пути нет. Волшебной таблетки тоже нет. Все очень долго, скучно и непонятно.
@user-rb8nk5zy8x
@user-rb8nk5zy8x 5 лет назад
@@zaemiel Долго? Да, скучно - это кому как. Я думаю кому скучно, те не смотрят и не учатся. А те. кто смотрит, вряд ли им скучно. Мне, например очень даже интересно! Непонятно? - Есть в некоторых местах. Но опять-таки, кто хочет, тот разберется и поймет. Тем более с такой подачей материала ! Олег, спасибо за то, что так доступно и разжовано! Твои видео для меня реально находка...
@user-rl5jy8od3d
@user-rl5jy8od3d 5 лет назад
спасибо
@midzakikayo2831
@midzakikayo2831 3 года назад
Материал отличный. Но такой вопрос продублировал код а в итоге ``` ready_to_read, _, _ = select(to_monitoring, [], []) ValueError: file descriptor cannot be a negative integer (-1) ``` Может быть такое связано с форточкой?
@user-xi3di7ws8l
@user-xi3di7ws8l 3 года назад
Класс, спасибо за объяснение, но есть один момент, если гасишь одного клиента, ложится весь сервак
@vrabosh
@vrabosh 4 года назад
Круто.
@user-wu3vd7dd2r
@user-wu3vd7dd2r 3 года назад
вопрос по поведению selecta при разрыве одного из соединений в to_monitor. Он начнёт игнорировать невалидный дескриптор или свалится?
@mmilerngruppe
@mmilerngruppe 3 года назад
правильно ли я понимаю, что в to_monitor будут накапливаться и уже закрытые соединения?
@kozlovsky5692
@kozlovsky5692 5 лет назад
Класс
@shazplay8878
@shazplay8878 3 года назад
Жаль я не видел этого видео когда писал игровой сервак на плюсах, понятнее видео по select на русскоязычном ютубе не видел 🔥
@nordost8
@nordost8 5 лет назад
Событийный цикл должен быть 1 на всю программу или в каждой её части отдельный? Например если я принимаю запрос от пользователя и прогоняю его через большой набор классов, в которых есть методы, я должен в каждом классе делать подобный event loop? (естественно если методы класса подходят для асинхронного выполнения)
@zaemiel
@zaemiel 5 лет назад
Событийный цикл должен быть только один
@igorkulibaba7287
@igorkulibaba7287 5 лет назад
Спасибо , очень профессионально. Если можно чутахи шрифт побольше. На мобильнике тяжковато разглядеть.
@zaemiel
@zaemiel 5 лет назад
Просто смотреть бесполезно, пустая трата времени. Это все нужно прорабатывать.
@johnmcway6120
@johnmcway6120 3 года назад
@@zaemiel Может голос твой приятен человеку вот. Удовольствие своего рода же. Зря ты так.
@radura942
@radura942 Год назад
Я правильно понял что функция select является блокирующей в event_loop?
@user-bs5uh5qy3h
@user-bs5uh5qy3h 2 года назад
Это уроки для профи !
@youarenotmygoal4890
@youarenotmygoal4890 3 года назад
Отчего эта ошибка возникает, когда запускаю ваше приложение? ValueError: file descriptor cannot be a negative integer(-1)
@user-yl3ry4eb1z
@user-yl3ry4eb1z 4 года назад
fire!
@sed4tive682
@sed4tive682 Месяц назад
Правильно ли я понимаю, что список ready to read все время пустой, до момента, пока пользователь не напишет сообщение или не подключится? 1 момент. Если пользователь подключается, то серверный сокет становится доступным для чтения и помещается в ready_to_read? 2 момент. Если пользователь отправляет сообщение, то клиентский сокет становится доступным для чтения и помещается в ready_to_read?
@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
@TheKzfor
@TheKzfor 3 года назад
а почему if sock is server_socket возвращает True?
@FieldmarshalDoob
@FieldmarshalDoob 5 лет назад
Я правильно понял что данный код будет корректно работать только на Unix'ах?
@zaemiel
@zaemiel 5 лет назад
нет, не правильно. Я этого не говорил.
@user-po8qo8ly8u
@user-po8qo8ly8u 4 года назад
Это и есть асинхронность в питоне? Насколько я понял вызовы ЛУУПа выполняются не паралельно а все равно последовательно, просто в бесконечном цикле? Да и обе функции остались блокирующими просто отрабатывают логику и возвращают управление в цикл? А главная блокирующая - ready_to_read = select()
@MrJet84
@MrJet84 Год назад
Не сразу это понял. Вдруг кому-то это сэкономит время: "готовый к чтению" - это означает, что в нем есть новое что прочитать!
@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 29 дней назад
@@RoTor_ExСпасибо, а то я в недоумении был, почему у меня клиент не может соединиться. Оказывается ему на каждой итерации закрывают сокет)
@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) Подскажите, пожалуйста, как это исправить.
@user-hs2sq1gh3u
@user-hs2sq1gh3u 3 года назад
у тебя в to_monitor остаются клиенты, которые уже отключены
@user-en2mg3wx8l
@user-en2mg3wx8l 2 года назад
Почему на 11:46 мы не создаём список to_monitor сразу с объектом server_socket, а добавляем объект в цикле? Вопрос выбора автора или принципиальное правило?
@Hagen11rus
@Hagen11rus 2 года назад
что из себя представляет if __name__ == '__main__' знаете?
@user-en2mg3wx8l
@user-en2mg3wx8l 2 года назад
@@Hagen11rus функция, выполнение которой начинается, если был запущен именно данный модуль?
@andreipopov2700
@andreipopov2700 4 года назад
👍🏻
@user-we9ct2tl9f
@user-we9ct2tl9f 5 лет назад
А не надо удалять сокеты из to_monitor после закрытия соединения? И закрывать server_socket в конце?
@felix30ua
@felix30ua 5 лет назад
server_socket там 1шт на всех ;)
@user-we9ct2tl9f
@user-we9ct2tl9f 5 лет назад
Это понятно, но я думал, что его перед выходом из программы тоже надо закрывать. Хотя, возможно, из-за 6 строки это не обязательно
@zaemiel
@zaemiel 5 лет назад
закройте, конечно. Но это не основной момент.
@xstratumm
@xstratumm 5 лет назад
Что за подсветка синтаксиса? Sublime Monokai?
@zaemiel
@zaemiel 5 лет назад
Я использую Atom. И да это немного измененная тема Monokai: github.com/kevinsawicki/monokai
@TeppopucT
@TeppopucT 5 лет назад
Огромное спасибо. Только теперь получается, что асинхронность это большой обман и, на самом деле, это таже последовательность но крупные задачи разбили на мелкие. И результат скармливают по чуть-чуть каждому, чтобы не думали что о них забыли.
@zaemiel
@zaemiel 5 лет назад
асинхронность - это не обман
@garrygaller2853
@garrygaller2853 4 года назад
"асинхронность - это не обман". Выше автор ответил. И он прав, потому что истинной параллельности на одном CPU вообще не существует. CPU, если вы не знали, всегда играет в пошаговую стратегию.
@kuksinsky
@kuksinsky 2 года назад
@@garrygaller2853 точнее будет сказать "не существует на одном ядре", но т.к. сейчас много ядер в CPU, то итинная параллельность все таки существует.
@vskovzgird
@vskovzgird 3 года назад
Единственная непонятная здесь вещь это select. Ну, ну. С сокетами мы конечно все поняли.
@lt197
@lt197 4 года назад
А почему мы в select() передаем клиентский сокет в списке для проверки на чтение? Я почему то был свято уверен, что вы его положите в список для проверки на запись. Ну, дескать, сервер, который исполняет скрипт мониторит свой сокет на чтение, куда прилетит сообщение от пользователя и сокет клиента на возможность записи, ведь серверу нужно записать туда ответ, разве нет?
@falconawp703
@falconawp703 3 года назад
Нам прилетает задача, которую нужно прочитать, поэтому на чтение
@guiterenzog2723
@guiterenzog2723 Год назад
Если честно, не совсем понял, каким образом перенос логики в event_loop меняет суть самих блокирующих функций. По сути, если функция блокирует дальнейшее выполнение кода, программа должна "зависнуть" в ожидании сообщения, но уже не в цикле while, а внутри условного recv. Почему это все-таки не так? Посидел, обдумал. Достигается за счет того, что блокирующие функции вызываются только в тот момент, когда для них есть действие, которое сразу снимает блокировку, верно?
@akiko233
@akiko233 9 месяцев назад
Получается, уже не блокирующие, т.к вызываются только когда от них есть, что получить
@user-ws9ed2br7d
@user-ws9ed2br7d 4 года назад
Кто-нибудь может подсказать что эта за ошибка ValueError: file descriptor cannot be a negative integer (-1)
@mrsanchez860
@mrsanchez860 4 года назад
у меня возникла такая же проблема, решения пока что не нашел(
@rainbowVax
@rainbowVax 4 года назад
@@mrsanchez860 под client_socket.close() нужно дописать to_monitor.remove(client_socket)
@kelevra1493
@kelevra1493 2 года назад
Немного непонятно, в каких случаях срабатывает: ``` else: print("close client socket") client_socket.close() ```
@fear4970
@fear4970 8 месяцев назад
Думаю не актуально, но для тех кто будет смотреть это видео в будущем, будет полезно. У нас условие if request , если оно будет пустым (просто нажать enter в терминале), тогда подключение закроется
@andrselt2274
@andrselt2274 4 года назад
Что за конструкция if sock is server_socket что за is ? это равносильно: if sock == server_socket ?
@zaemiel
@zaemiel 4 года назад
Похоже, но не равносильно. is - сравнивает сами объекты, а не значения
@andrselt2274
@andrselt2274 4 года назад
@@zaemiel Спасибо! Почитаю в интернете.
@mikakost
@mikakost 4 года назад
У меня не принял второго клиента, только после отключения первого. Код проверил, как в видео Это ограничения Windows 7 / telnet ?
@Vnickv
@Vnickv 4 года назад
Нет, у меня всё работает на w7 + telnet. Проверяйте код. (Уже наверное неактуально, оставляю для тех, у кого такая же проблема)
@SAVSAV1212
@SAVSAV1212 29 дней назад
На Ubuntu/telnet тоже работает
@gpankov
@gpankov Год назад
Я так и не понял почему в в список to_monitor передаем server_socket
@gpankov
@gpankov Год назад
ну хорошо, я понял мы туда передаем объект, у которого есть метод .fileno, но как я должен понять что у объекта есть такой метод, а если нет? А если я просто чат бота делаю, как с помощью селекта запускать функции в ивентлупе?
@ealbitg1043
@ealbitg1043 4 года назад
Это сработает, даже если одновременно два клиента направят request?
@zaemiel
@zaemiel 4 года назад
вы видео не смотрели штоль?
@Krasnolesye
@Krasnolesye 3 года назад
@@zaemiel На видео, запросы отправляют 2 клиента, но последовательно. Его интересовало - если одновременно
@user-eb3lz3ox8u
@user-eb3lz3ox8u 2 года назад
Для новичков очень понятно, проще некуда. Чтобы понять одну хрень автор нагрузил в ролик кучу другой непонятной хрени
@alexanderpadalka5708
@alexanderpadalka5708 3 года назад
@dbte5
@dbte5 11 месяцев назад
Видно, что несложно, но нужно изначальное понимает сокетов, селекта и т.д.
@indominusmonster6433
@indominusmonster6433 Год назад
не работает, говорит что не может использовать список с пинус первым индексом
@zaemiel
@zaemiel Год назад
работает. Проверяте ваш код
@funreal8727
@funreal8727 2 года назад
2:30 ачепятка
@maydjin
@maydjin 2 года назад
Лучше бы вернуть сокет из accept_connection, чем делать сайд эффект на глобальное состояние.
@deniscypukat4377
@deniscypukat4377 5 лет назад
Было бы весьма удобно так же получить "исходники" из примеров, для более удобного освоения.
@zaemiel
@zaemiel 5 лет назад
Знание - через делание.
@deniscypukat4377
@deniscypukat4377 5 лет назад
@@zaemiel разумеется, но простое перепечатывание редко помогает. А вот взять код, натыкать точек остановок, посмотреть, что происходит, потом пересмотреть видео - гораздо более эффективно. На самом деле, пример ну прямо отсюда docs.python.org/3/library/selectors.html
@deniscypukat4377
@deniscypukat4377 5 лет назад
ой... не к тому видео))) К следующему))
@zaemiel
@zaemiel 5 лет назад
практически да, но не совсем, как видите. По работе с selectors - это самый базовый вариант.
@user-rb8nk5zy8x
@user-rb8nk5zy8x 5 лет назад
@@deniscypukat4377 а еще более эффективно - после просмотра видео, повторить все это вручную, так же пошагово и обьяснять себе самому (или коту или утке, есть такой метод) все что делаеш. И вот тогда всплывет то, что не усвоилось. Потом пойдет пересмотр этих моментов и в итоге прийдет понимание того, для чего каждая конкретная строка кода и почему она здесь а не где-то там. Проверенный метод. Долго, но зато потом все на своих полочках и выуживается из головы так же легко как это у Олега, прям на одном дыхании :)
@Anklav24
@Anklav24 3 года назад
Кто на Windows 10 запускайте через WSL иначе не будет работать)
@artemqqq7153
@artemqqq7153 Год назад
Сложно понять конечно, не зная сокетов
@andreypr503
@andreypr503 Год назад
На самом деле это не в одном потоке выполняется, в нутри select запускаются потоки тоже самое можно было сделать с помощью threading и самим мониторить сокет на доступность, но тогда магия теряется, а так кручу верчу запуть хочу
@zaemiel
@zaemiel Год назад
Это выполняется в одном потоке. Суть всей серии в том, чтобы не использовать threading.
@andreynezametin1679
@andreynezametin1679 4 месяца назад
@@zaemiel А как можно сделать асинхронным код, не используя многопоточность или прерывание?😚 второе современные ос не дадут сделать, только на уровне api ос. Ну а если объективно, то данный пример, который у Вас - он по прежнему содержит блокирующие функции, если увеличить объем recv, и отправлять в ответ клиенту файл например, то он так же будет блокировать всю программу.
@googleadmin4749
@googleadmin4749 8 месяцев назад
Как напёрсточник, хотел про асинхронность, а в итоге два видео без единой строчки асинхронного кода 😂
@zaemiel
@zaemiel 8 месяцев назад
эх был у меня закрепленный коммент на эту тему и я его изменил. Словом это все про асинхронность и я это наглядно демонстрирую. Но вы можете отписаться от канала в любой момент и выбрать в меньшке ютуба "Не рекоммендовать с этого канала". Делов-то.
@zaemiel
@zaemiel 8 месяцев назад
а я нашел этот коммент. Прочитайте закрепленный комментарий к 4-му видео этой серии: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-PjZUSSkGLE8.html
Далее
FUN&SUN | Update 0.29.0 Trailer | Standoff 2
02:32
Просмотров 979 тыс.
Основы Asyncio
53:25
Просмотров 11 тыс.
Основы многопоточности в Python
58:46
ASYNCIO НА ПРАКТИЧЕСКОМ ПРИМЕРЕ
22:44