Как на самом деле устроены каналы в Golang? | Golang channels internals
Разбираемся со внутренним устройством каналов: как реализована потокобезопасноть, как в буферизированном канале хранятся данные, какие интересные оптимизации там есть, как работает оператор 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
❤ Если у вас есть желание поддержать развитие канала: www.patreon.com/tuzov boosty.to/nikolay.tuzov - 👾 Мой канал в Telegram: t.me/ntuzov - 🗣 Чат в Telegram: t.me/+zsSZ63wEJDs3NGVi - 👀 Golang Digest: t.me/golang_digest - мои регулярные подборки интересных материалов по Go
"Сегодня я вам покажу, что каналы на деле устроены легко и просто" Также видео: 41 минута))) Просто шутка, не обижаемся))) 101% пушка.
Всё так))
Николай, спасибо за труд! очень круто - понятно, с нужными деталями и без ненужных упрощений!
Спасибо за труд, Николай! Отличные видео.
Отличное объяснение 😘 побольше бы таких видео про внутрянку Go!
лучшее что я видел по Go в ру туториалах, просто огонь!
Спасибо! У вас редкое умение, объяснять сложные вещи простыми словами.
Отличная подача материала! Спасибо автору
Круто, больше таких разборов про нюансы реализации. Это очень интересно и познавательно.
Спасибо за столь подробную информацию
Вау, какое глубокое объяснение. Спасибо! Иллюстрации - моё почтение)
Ура Видосик подъехал .Наконец-то каналы!!!
Долго ждали ) Надеюсь оно того стоит, 40 минут😮 Спасибо!
Думаю, стоит 😚 Я постарался минимизировать количество воды, и очень долго работал над структурой. Надеюсь, не зря)
Посмотрел на одном дыхании, все четко и без воды👍Еще раз благодарю за этот прекрасный разбор каналов.
Моё уважение! Очень классное объяснение!
Спасибо огромное за ролик! ❤ Вот это я понимаю разбор, вот это уровень! Отлично переплетённые части анимации, уточнений, ухода в самую маковку кодовой базы и ёмких лаконичных выводов! Как всегда достаточно полно, чтобы понять и главное понять куда двигаться и вовремя сокращено, чтобы не перезагрузить в усмерть - это талан, и я рад, что вы, Старший разработчик категории 2, им обладаете xD Жду ролик про Планировщик, уверен в качестве! ¡Buena suerte en México, amigo! ❤
Николай, у вас талант объяснять, и понятно, что требуется очень много времени на подготовку даже небольшого видео
Николай, спасибо за труд! Очень интересно про атомики подробнее
Спасибо большое. Читал статьи, документацию, после твоего видео все встало на места.
Невероятно крутой видос, много полезного материала, объясняемого не то что бы сложным языком. Сейчас как раз готовлюсь к собесу на го дева, очень помогло, спасибо!
Классное видео, спасибо! После этого видео стал лучше понимать материал про каналы из других источников, что улучшило понимание в целом
Очень качественный контент. Заочно поставил лайк!
Контент в кайф. Давай еще. Давай, давай, давай.
Спасибо за виде! Очень познавательно
Спасибо за огромню работу
всё понятно, большое спасибо!
Благодарю, лайк авансом!
Spasibo!
большой труд - и очень понятно, благодарю!
Супер! Спасибо огромное!
Спасибо за видео очень классное видео побольше бы таких Про то как корутины или потоки работают
Спасибо! Отличная подача материала. Сначала комиксы и объяснение, затем разбор кода. Респект!
Ждём видео про планировщик от Тузова 😊
Николай, отличное видео. Жду видео про атомики на разных архитектурах
Спасибо большое за видео, это лучшие видео по устройству го что я видел 👍🏻👍🏻👍🏻👍🏻👍🏻
Так-с, интересно, подписался
Редко я такое пишу. Молодец! Все наглядно.
Спасибо большое!
Очень спасибо!
Спасибо 🙏🏻❤️
Гениальнейшее видео, все понятно!
Уже думал читать статью, а тут видео вовремя
Большое спасибо за видео, все очень понятно и интересно) Подскажите пожалуйста, где можно ознакомиться с такими подробностями о языке?
Дуже якісне відео. Автор топчик, кожна деталь розгорнута, за ці 40 хвилин автор розкрив фундамент з яким можна вільно програмувати. Дуже дякую тобі авторе ❤
Спасибо за видео
спасибо- у вас талант расказывать про иные измерения инопланетным языком)- вот ненашто даже возразить)
годно!)
Ооочень крутое видео!
Очень интересно было бы послушать про concurrency в go простым языком. Не так много доступных ресурсов на эту тему и сама тема достаточно сложна)
Это вам не "весь go за 20 минут"
Николай, про атомик очень интересно! Как это все устроено, почему работает именно так. Большое спасибо!
Большое спасибо за отличные, подробные объяснения! 😍😍😍
топ контент !!!
Расскажи ещё про разницу string aka []byte. В чем преимущества той и другой структуры, в чем разница, когда использовать , и что происходит при обратной конвертации)
контент - бомба
Привет! Очень круто! Продолжай! Вопрос, в какой проге делать такие красивые картинки и схемы?
Схемы в основном тут делаю: excalidraw.com Но часть приходится рисовать прямо в PowerPoint, тогда меньше возни с анимацией. Гоферов просто в интернете нахожу.
отличная подача материала, а еще отличные подкасты с крутыми ребятами, не забрасывай, пожалуйста, это
Один момент не доконца понмаю, после парковки горутину, насколько я понимаю работу планировщика, она отправляется в глобальную очередь, соответственно после её пробуждения она возвращается в очередь (fifo/lifo?) на какой-либо процессор или там не все так просто?
Очень достойная обучалка-объяснялка, всё понятно и доступно, спасибо.
я пока просмотрел только 3 минуты, но мне уже нравится
Блин, очень очень круто и понятно всё рассказал, делай свой курс по Го.)
Видео топ! Но у меня чуть глаза не вытекли, когда резко переключилась IDE на белый фон 😵💫
Николай, вы ах*eнны!Спасибо за детализацию!
Спасибо за видео! Каналы перестали казаться чем-то инопланетным :) Вот такой вопрос возник: если по сути дела каналы реализованы отдельной библиотекой, и эту структуру может повторить любой разработчик, то зачем в го отдельный синтаксис чтения/записи в канал (оператор
Наконец человек не делает вид, а на самом деле знает что такое го
ролик бомба, наверно лучший гофер в рус ютубе
а что если в sendq несколько спящих горутин. Условно одна спящая горутина с нужными данными, а другая горутина с абсолютно другими данными, что в этом случае ? Или в качестве спящей горутины берется только самая последняя горутина.
Николай, какую IDE ты используешь?
GoLand от компании JetBrains
Привет! Классные у тебя разборы, разбери плз как работает планировщик go 1.20, а то я не нашел нормального урока
Такой ролик как раз в процессе сейчас
Скажите, в каком редакторе автор демонстрирует этот урок? Тоже начал бы такой использовать, где столько информации внутренней и sandbox.
Это GoLand - IDE от JetBrains. Он платный, но есть еще VSCode - бесплатный и тоже хороший. Я думаю, там всё это тоже есть.
@@nikolay_tuzov Спасибо! Николай, как вы считаете, должен ли голангер по-умолчанию уметь работать с PostgreSQL, ElasticSearch, Mongo при собесе? У меня 90% отказов из-за отсутствия опыта по базам, но я всегда юзал самописные в своих разработках, а впрок учить просто так нет желания, да и не запомнится без долгой практики.
Про select не расказано как паркуется горутина если ни один из кейсов не сработает, ведь каналов в select может быть несколько. И как тогда просыпается горутина если ее будят по любому каналу и как она защищает себя от того, что проснулась, а возможности писать/читать уже нет потому что конкурентная горутина прочитала.
7:40 Секундочку сами данные будут скопированны в канал или ссылки на данные?
Значения, конечно же. Но сами значения тоже могут быть указателями, тогда в канал будут скопированы указатели.
@@nikolay_tuzov Спасибо
Про атомики 100% нужно. Тема сложная, емкая
Если канал заполнен и горутина пытается в неё что-то записать, то как именно горутина получает этот поток (переменную), чтобы потом завернуть в очередь sudog?
Запишите пожалуйста разъясняющий ролик про atomic, а то все дойти до них не могу. За ранее спасибо.
А как Reader-горутина прочитает данные из канала, если Sender перед тем как пойти спать не разблокировал мьютекс
В момент когда горутина блокируется, кто разблокирет мьютекс? Сама горутина перед блокировкой?
Осталось не понятным, почему isClosed это int32, а не bool или хотя бы int8
Это очень хороший вопрос. Если кратко - потому что пакет атомик не поддерживает bool. Хотя, с 1.19 поддерживает, но на самом деле, под капотом там всем равно int. Можешь также почитать обсуждение в комментах к моему посту на эту же тему: t.me/ntuzov/26 А если захочется еще глубже копнуть, добро пожаловать в наш чатик Gopher Club, там у нас есть знатоки, которые помогут разобраться даже в самых низкоуровневых вопросах.
незаслуженно мало подписчиков и просмотров. и лайков
про атомики интересно было бы
спасибо за простату) - ты умеешь довести человека до отчаяния)
Поделитесь первоисточником
Их много, я для ролика прорабатываю много статьей, видосов, докладов
как то странно прозвучало "если вы используете каналы вам не надо задумываться об элементах синхронизации" что-то не то с причинно-следственными связями точно также я могу сказать "используя мютекс, мне не надо задумываться о каналах, как и в каком порядке их открывать/закрывать, как избегать записи/чтения в/с нил каналами, как избежать паники при работе с каналами и т.д.и т .п.". Что звучит еще более страшно ))) стоит задача, организовать работу двух и более потоков/горутин и в каждом конретном случае ты выбираешь какой элемент синхронизации использовать мютекс или что-то другое, в том числе канал
А что не так с причинно-следственными связями? Давайте я задам несколько наводящих вопросов: Вот возьмём мапу - может ли несколько горутин одновременно добавлять в неё элементы? А в канал они могут одновременно писать? Почему? Если этого недостаточно, можем обсудить подробней в нашем чатике: t.me/+WyjmnP6la_QyYjAy Вести переписку в комментариях не очень удобно.
Если кратко - канал не является примитивом синхронизации. Канал сам использует примитив синхронизации, а именно - встроенный мьютекс. И благодаря этому, разработчику не требуется прикрывать канал внешним мьютексом. Надеюсь, так понятней.
@nikolay_tuzov а mutex точно полностью блокирует буферизированный канал? Чтение невозможно одновременно с записью?
Каналы без горутин - это что-то из серии велосипед с одним колесом