Тёмный

Как на самом деле устроены каналы в Golang? | Golang channels internals 

Николай Тузов — Golang
Подписаться 19 тыс.
Просмотров 52 тыс.
50% 1

Разбираемся со внутренним устройством каналов: как реализована потокобезопасноть, как в буферизированном канале хранятся данные, какие интересные оптимизации там есть, как работает оператор Select, как каналы закрываются и др.
----
❤️ Если у вас есть желание поддержать развитие канала:
/ tuzov
boosty.to/nikolay.tuzov
- 👾 Мой канал в Telegram: t.me/ntuzov
- 🗣 Чат в Telegram: t.me/+zsSZ63wEJDs3NGVi
- 👀 Golang Digest: t.me/golang_digest - мои регулярные подборки интересных материалов по Go.
----
Другие мои видео про внутреннюю реализацию Go:
Map: • Как на самом деле устр...
Slice: • GoLang Slice в деталях...
Тайминги:
00:00 Вступление
00:38 Какие свойства каналов интересно изучить?
01:22 Проектирование каналов
01:32 В какой области памяти хранятся каналы?
02:00 Структура канала
04:08 Реализация свойств: goroutine-safe и FIFO
05:04 Как работают буфер канала и mutex
07:18 Передача данных в канал
08:21 Получение данных из канала
08:38 Переполнение буфера
09:05 Как устроен планировщик (Scheduler)
10:14 Как поставить горутину на паузу
10:56 Как разбудить горутину: очередь спящих горутин - sendq
13:49 Чтение из переполненного канала
15:57 Пробуждение спящей горутины Sender
17:43 Чтение из пустого канала
18:44 Передача данных напрямую между стэками двух горутин
19:11 Небуферизированные каналы
19:37 Итоги по изучению интересных свойств каналов
20:35 Изучаем код реализации каналов
28:22 Изучаем поведение канала вживую с помощью дебагера
35:23 Как работает Select
37:14 Закрытие канала
38:13 Код закрытия канала
39:20 Итоги: почему каналы спроектированны именно так?
40:48 Заключение
#golang #ntuzov

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

 

14 июн 2024

Поделиться:

Ссылка:

Скачать:

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

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 101   
@nikolay_tuzov
@nikolay_tuzov Год назад
❤ Если у вас есть желание поддержать развитие канала: www.patreon.com/tuzov boosty.to/nikolay.tuzov - 👾 Мой канал в Telegram: t.me/ntuzov - 🗣 Чат в Telegram: t.me/+zsSZ63wEJDs3NGVi - 👀 Golang Digest: t.me/golang_digest - мои регулярные подборки интересных материалов по Go
@alexzav1327
@alexzav1327 14 дней назад
Это самый подробный разбор внутренностей каналов, что я смог найти, но при это всё изложено понятным языком. Спасибо большое!
@defanji8484
@defanji8484 Год назад
"Сегодня я вам покажу, что каналы на деле устроены легко и просто" Также видео: 41 минута))) Просто шутка, не обижаемся))) 101% пушка.
@nikolay_tuzov
@nikolay_tuzov Год назад
Всё так))
@sinfulnest
@sinfulnest Год назад
Николай, спасибо за труд! очень круто - понятно, с нужными деталями и без ненужных упрощений!
@mmkamron
@mmkamron Год назад
Долго ждали ) Надеюсь оно того стоит, 40 минут😮 Спасибо!
@nikolay_tuzov
@nikolay_tuzov Год назад
Думаю, стоит 😚 Я постарался минимизировать количество воды, и очень долго работал над структурой. Надеюсь, не зря)
@mmkamron
@mmkamron Год назад
Посмотрел на одном дыхании, все четко и без воды👍Еще раз благодарю за этот прекрасный разбор каналов.
@TheDavBag
@TheDavBag Год назад
лучшее что я видел по Go в ру туториалах, просто огонь!
@Maxlyaptsev
@Maxlyaptsev Год назад
Это вам не "весь go за 20 минут"
@micbalmicbalov9955
@micbalmicbalov9955 Год назад
Спасибо! У вас редкое умение, объяснять сложные вещи простыми словами.
@phnxbr
@phnxbr 11 месяцев назад
Николай, у вас талант объяснять, и понятно, что требуется очень много времени на подготовку даже небольшого видео
@mjeksonmjekson4469
@mjeksonmjekson4469 Год назад
Круто, больше таких разборов про нюансы реализации. Это очень интересно и познавательно.
@vic_shine
@vic_shine Год назад
Отличное объяснение 😘 побольше бы таких видео про внутрянку Go!
@beyond6596
@beyond6596 Год назад
Николай, спасибо за труд! Очень интересно про атомики подробнее
@user-uw1nk8uk6m
@user-uw1nk8uk6m Год назад
Спасибо за труд, Николай! Отличные видео.
@user-pt4iz2py6k
@user-pt4iz2py6k Год назад
Спасибо огромное за ролик! ❤ Вот это я понимаю разбор, вот это уровень! Отлично переплетённые части анимации, уточнений, ухода в самую маковку кодовой базы и ёмких лаконичных выводов! Как всегда достаточно полно, чтобы понять и главное понять куда двигаться и вовремя сокращено, чтобы не перезагрузить в усмерть - это талан, и я рад, что вы, Старший разработчик категории 2, им обладаете xD Жду ролик про Планировщик, уверен в качестве! ¡Buena suerte en México, amigo! ❤
@UAStriker
@UAStriker Год назад
Спасибо за столь подробную информацию
@denissokolov4029
@denissokolov4029 Год назад
Невероятно крутой видос, много полезного материала, объясняемого не то что бы сложным языком. Сейчас как раз готовлюсь к собесу на го дева, очень помогло, спасибо!
@sergey5758
@sergey5758 Месяц назад
Спасибо большое за видео, это лучшие видео по устройству го что я видел 👍🏻👍🏻👍🏻👍🏻👍🏻
@hurlimanjumamuratova2425
@hurlimanjumamuratova2425 24 дня назад
Спасибо большое, очень понравилось. Желаю успехов вам добрый человек☺️
@user-xj5up2yq6e
@user-xj5up2yq6e Год назад
Отличная подача материала! Спасибо автору
@riendlyf
@riendlyf 3 месяца назад
Дуже якісне відео. Автор топчик, кожна деталь розгорнута, за ці 40 хвилин автор розкрив фундамент з яким можна вільно програмувати. Дуже дякую тобі авторе ❤
@Iongjump
@Iongjump Год назад
Вау, какое глубокое объяснение. Спасибо! Иллюстрации - моё почтение)
@virtualriot4062
@virtualriot4062 Год назад
Уже думал читать статью, а тут видео вовремя
@andreypalamarchuk472
@andreypalamarchuk472 10 месяцев назад
Ждём видео про планировщик от Тузова 😊
@smittychannel3252
@smittychannel3252 Год назад
Ура Видосик подъехал .Наконец-то каналы!!!
@bambalbino
@bambalbino 4 месяца назад
Спасибо большое. Читал статьи, документацию, после твоего видео все встало на места.
@user-mx9pu5fb6v
@user-mx9pu5fb6v Год назад
Классное видео, спасибо! После этого видео стал лучше понимать материал про каналы из других источников, что улучшило понимание в целом
@ifdru74
@ifdru74 11 дней назад
Спасибо за лекцию.
@stanislav3827
@stanislav3827 Год назад
Моё уважение! Очень классное объяснение!
@relax9332
@relax9332 Год назад
Очень качественный контент. Заочно поставил лайк!
@whiteniga9489
@whiteniga9489 Год назад
Спасибо за виде! Очень познавательно
@liteleak4049
@liteleak4049 6 месяцев назад
Спасибо за огромню работу
@kwynto
@kwynto Год назад
Контент в кайф. Давай еще. Давай, давай, давай.
@DJamal1803
@DJamal1803 4 месяца назад
Спасибо за видео очень классное видео побольше бы таких Про то как корутины или потоки работают
@user-ee1lx1pe7n
@user-ee1lx1pe7n Год назад
Супер! Спасибо огромное!
@user-bc8mo2ml1z
@user-bc8mo2ml1z Год назад
всё понятно, большое спасибо!
@user-vt4fr8pu3d
@user-vt4fr8pu3d Год назад
Благодарю, лайк авансом!
@maxreshe6410
@maxreshe6410 Год назад
Спасибо! Отличная подача материала. Сначала комиксы и объяснение, затем разбор кода. Респект!
@Dantesik1
@Dantesik1 Год назад
Гениальнейшее видео, все понятно!
@user-cu9yp3me5y
@user-cu9yp3me5y Год назад
Николай, отличное видео. Жду видео про атомики на разных архитектурах
@kekstroke
@kekstroke Год назад
Очень интересно было бы послушать про concurrency в go простым языком. Не так много доступных ресурсов на эту тему и сама тема достаточно сложна)
@a98cb985
@a98cb985 Год назад
Очень спасибо!
@PavPetukhov
@PavPetukhov 6 месяцев назад
Так-с, интересно, подписался
@user-eo9td2bj5q
@user-eo9td2bj5q 10 месяцев назад
спасибо- у вас талант расказывать про иные измерения инопланетным языком)- вот ненашто даже возразить)
@abonentnumber3283
@abonentnumber3283 10 месяцев назад
Редко я такое пишу. Молодец! Все наглядно.
@user-tv2hs5rs4t
@user-tv2hs5rs4t Год назад
Спасибо большое!
@user-yt5qk6fi8m
@user-yt5qk6fi8m 5 месяцев назад
Наконец человек не делает вид, а на самом деле знает что такое го
@invisibleinvisible83
@invisibleinvisible83 Год назад
Спасибо 🙏🏻❤️
@grigoriirochev440
@grigoriirochev440 Год назад
большой труд - и очень понятно, благодарю!
@germanzak
@germanzak Год назад
Видео топ! Но у меня чуть глаза не вытекли, когда резко переключилась IDE на белый фон 😵‍💫
@andreipopov2700
@andreipopov2700 Год назад
Спасибо за видео
@puzz1372
@puzz1372 Год назад
Николай, про атомик очень интересно! Как это все устроено, почему работает именно так. Большое спасибо!
@ArtemCYOU
@ArtemCYOU Год назад
годно!)
@noob-mp7jo
@noob-mp7jo 10 месяцев назад
Spasibo!
@Kuchaian
@Kuchaian Год назад
Ооочень крутое видео!
@ronalddavilla5602
@ronalddavilla5602 Год назад
Привет! Очень круто! Продолжай! Вопрос, в какой проге делать такие красивые картинки и схемы?
@nikolay_tuzov
@nikolay_tuzov Год назад
Схемы в основном тут делаю: excalidraw.com Но часть приходится рисовать прямо в PowerPoint, тогда меньше возни с анимацией. Гоферов просто в интернете нахожу.
@user-tt3xw7cs5s
@user-tt3xw7cs5s Год назад
я пока просмотрел только 3 минуты, но мне уже нравится
@mjeksonmjekson4469
@mjeksonmjekson4469 Год назад
Расскажи ещё про разницу string aka []byte. В чем преимущества той и другой структуры, в чем разница, когда использовать , и что происходит при обратной конвертации)
@user-zx4rj1gs4c
@user-zx4rj1gs4c Год назад
отличная подача материала, а еще отличные подкасты с крутыми ребятами, не забрасывай, пожалуйста, это
@emotional_stuff
@emotional_stuff Год назад
контент - бомба
@elvirakharunova1589
@elvirakharunova1589 4 месяца назад
Большое спасибо за отличные, подробные объяснения! 😍😍😍
@proger150
@proger150 11 месяцев назад
Николай, вы ах*eнны!Спасибо за детализацию!
@MicaelAlastor
@MicaelAlastor 11 месяцев назад
Очень достойная обучалка-объяснялка, всё понятно и доступно, спасибо.
@mrmarkovniktgv3058
@mrmarkovniktgv3058 10 месяцев назад
Большое спасибо за видео, все очень понятно и интересно) Подскажите пожалуйста, где можно ознакомиться с такими подробностями о языке?
@user-hd9hw7nl1n
@user-hd9hw7nl1n Год назад
топ контент !!!
@romankonovalov2588
@romankonovalov2588 Год назад
ролик бомба, наверно лучший гофер в рус ютубе
@RomanAlexandrov
@RomanAlexandrov 11 месяцев назад
Блин, очень очень круто и понятно всё рассказал, делай свой курс по Го.)
@orifdjonergashev9472
@orifdjonergashev9472 Год назад
Привет! Классные у тебя разборы, разбери плз как работает планировщик go 1.20, а то я не нашел нормального урока
@nikolay_tuzov
@nikolay_tuzov Год назад
Такой ролик как раз в процессе сейчас
@user-nc8tl5cv6k
@user-nc8tl5cv6k Год назад
Спасибо за видео! Каналы перестали казаться чем-то инопланетным :) Вот такой вопрос возник: если по сути дела каналы реализованы отдельной библиотекой, и эту структуру может повторить любой разработчик, то зачем в го отдельный синтаксис чтения/записи в канал (оператор
@plush_penguin
@plush_penguin Год назад
Николай, какую IDE ты используешь?
@nikolay_tuzov
@nikolay_tuzov Год назад
GoLand от компании JetBrains
@user-fe6pi9vb6h
@user-fe6pi9vb6h 10 месяцев назад
Один момент не доконца понмаю, после парковки горутину, насколько я понимаю работу планировщика, она отправляется в глобальную очередь, соответственно после её пробуждения она возвращается в очередь (fifo/lifo?) на какой-либо процессор или там не все так просто?
@waffleboot
@waffleboot 8 месяцев назад
Про select не расказано как паркуется горутина если ни один из кейсов не сработает, ведь каналов в select может быть несколько. И как тогда просыпается горутина если ее будят по любому каналу и как она защищает себя от того, что проснулась, а возможности писать/читать уже нет потому что конкурентная горутина прочитала.
@SWOsong
@SWOsong 7 месяцев назад
Скажите, в каком редакторе автор демонстрирует этот урок? Тоже начал бы такой использовать, где столько информации внутренней и sandbox.
@nikolay_tuzov
@nikolay_tuzov 7 месяцев назад
Это GoLand - IDE от JetBrains. Он платный, но есть еще VSCode - бесплатный и тоже хороший. Я думаю, там всё это тоже есть.
@SWOsong
@SWOsong 7 месяцев назад
@@nikolay_tuzov Спасибо! Николай, как вы считаете, должен ли голангер по-умолчанию уметь работать с PostgreSQL, ElasticSearch, Mongo при собесе? У меня 90% отказов из-за отсутствия опыта по базам, но я всегда юзал самописные в своих разработках, а впрок учить просто так нет желания, да и не запомнится без долгой практики.
@lauhG3
@lauhG3 9 месяцев назад
а что если в sendq несколько спящих горутин. Условно одна спящая горутина с нужными данными, а другая горутина с абсолютно другими данными, что в этом случае ? Или в качестве спящей горутины берется только самая последняя горутина.
@soundcloudlover
@soundcloudlover 10 месяцев назад
Если канал заполнен и горутина пытается в неё что-то записать, то как именно горутина получает этот поток (переменную), чтобы потом завернуть в очередь sudog?
@leenur4749
@leenur4749 3 месяца назад
А как Reader-горутина прочитает данные из канала, если Sender перед тем как пойти спать не разблокировал мьютекс
@OOOJohnJ
@OOOJohnJ Год назад
Осталось не понятным, почему isClosed это int32, а не bool или хотя бы int8
@nikolay_tuzov
@nikolay_tuzov Год назад
Это очень хороший вопрос. Если кратко - потому что пакет атомик не поддерживает bool. Хотя, с 1.19 поддерживает, но на самом деле, под капотом там всем равно int. Можешь также почитать обсуждение в комментах к моему посту на эту же тему: t.me/ntuzov/26 А если захочется еще глубже копнуть, добро пожаловать в наш чатик Gopher Club, там у нас есть знатоки, которые помогут разобраться даже в самых низкоуровневых вопросах.
@736939
@736939 6 месяцев назад
7:40 Секундочку сами данные будут скопированны в канал или ссылки на данные?
@nikolay_tuzov
@nikolay_tuzov 6 месяцев назад
Значения, конечно же. Но сами значения тоже могут быть указателями, тогда в канал будут скопированы указатели.
@736939
@736939 6 месяцев назад
@@nikolay_tuzov Спасибо
@robotomize7123
@robotomize7123 Год назад
Про атомики 100% нужно. Тема сложная, емкая
@user-jq3nx1gb2m
@user-jq3nx1gb2m Год назад
В момент когда горутина блокируется, кто разблокирет мьютекс? Сама горутина перед блокировкой?
@volodya-nrg
@volodya-nrg Год назад
Запишите пожалуйста разъясняющий ролик про atomic, а то все дойти до них не могу. За ранее спасибо.
@Hande_hoch
@Hande_hoch Год назад
незаслуженно мало подписчиков и просмотров. и лайков
@artemrusinov3034
@artemrusinov3034 Год назад
Поделитесь первоисточником
@nikolay_tuzov
@nikolay_tuzov Год назад
Их много, я для ролика прорабатываю много статьей, видосов, докладов
@slavanikulin8069
@slavanikulin8069 Год назад
про атомики интересно было бы
@user-eo9td2bj5q
@user-eo9td2bj5q 9 месяцев назад
спасибо за простату) - ты умеешь довести человека до отчаяния)
@oleksandrdorogyh5265
@oleksandrdorogyh5265 Год назад
как то странно прозвучало "если вы используете каналы вам не надо задумываться об элементах синхронизации" что-то не то с причинно-следственными связями точно также я могу сказать "используя мютекс, мне не надо задумываться о каналах, как и в каком порядке их открывать/закрывать, как избегать записи/чтения в/с нил каналами, как избежать паники при работе с каналами и т.д.и т .п.". Что звучит еще более страшно ))) стоит задача, организовать работу двух и более потоков/горутин и в каждом конретном случае ты выбираешь какой элемент синхронизации использовать мютекс или что-то другое, в том числе канал
@nikolay_tuzov
@nikolay_tuzov Год назад
А что не так с причинно-следственными связями? Давайте я задам несколько наводящих вопросов: Вот возьмём мапу - может ли несколько горутин одновременно добавлять в неё элементы? А в канал они могут одновременно писать? Почему? Если этого недостаточно, можем обсудить подробней в нашем чатике: t.me/+WyjmnP6la_QyYjAy Вести переписку в комментариях не очень удобно.
@nikolay_tuzov
@nikolay_tuzov Год назад
Если кратко - канал не является примитивом синхронизации. Канал сам использует примитив синхронизации, а именно - встроенный мьютекс. И благодаря этому, разработчику не требуется прикрывать канал внешним мьютексом. Надеюсь, так понятней.
@timurkash
@timurkash Год назад
Каналы без горутин - это что-то из серии велосипед с одним колесом
@N4g1b4t0r
@N4g1b4t0r 3 месяца назад
@nikolay_tuzov а mutex точно полностью блокирует буферизированный канал? Чтение невозможно одновременно с записью?
Далее
Homemade Professional Spy Trick To Unlock A Phone 🔍
00:55
7  ПАРАДОКСОВ БЕСКОНЕЧНОСТИ
36:02
Что нужно знать о слайсах в Go?
28:34
Хэш-таблицы за 10 минут
13:01
Просмотров 121 тыс.