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

2024 ж. 16 Мам.
48 847 Рет қаралды

Разбираемся со внутренним устройством каналов: как реализована потокобезопасноть, как в буферизированном канале хранятся данные, какие интересные оптимизации там есть, как работает оператор 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

    @nikolay_tuzov@nikolay_tuzov Жыл бұрын
  • "Сегодня я вам покажу, что каналы на деле устроены легко и просто" Также видео: 41 минута))) Просто шутка, не обижаемся))) 101% пушка.

    @defanji8484@defanji8484 Жыл бұрын
    • Всё так))

      @nikolay_tuzov@nikolay_tuzov Жыл бұрын
  • Николай, спасибо за труд! очень круто - понятно, с нужными деталями и без ненужных упрощений!

    @sinfulnest@sinfulnest Жыл бұрын
  • Спасибо за труд, Николай! Отличные видео.

    @user-uw1nk8uk6m@user-uw1nk8uk6m Жыл бұрын
  • Отличное объяснение 😘 побольше бы таких видео про внутрянку Go!

    @vic_shine@vic_shine Жыл бұрын
  • лучшее что я видел по Go в ру туториалах, просто огонь!

    @TheDavBag@TheDavBag Жыл бұрын
  • Спасибо! У вас редкое умение, объяснять сложные вещи простыми словами.

    @micbalmicbalov9955@micbalmicbalov9955 Жыл бұрын
  • Отличная подача материала! Спасибо автору

    @user-xj5up2yq6e@user-xj5up2yq6e Жыл бұрын
  • Круто, больше таких разборов про нюансы реализации. Это очень интересно и познавательно.

    @mjeksonmjekson4469@mjeksonmjekson4469 Жыл бұрын
  • Спасибо за столь подробную информацию

    @UAStriker@UAStriker Жыл бұрын
  • Вау, какое глубокое объяснение. Спасибо! Иллюстрации - моё почтение)

    @Iongjump@Iongjump Жыл бұрын
  • Ура Видосик подъехал .Наконец-то каналы!!!

    @smittychannel3252@smittychannel3252 Жыл бұрын
  • Долго ждали ) Надеюсь оно того стоит, 40 минут😮 Спасибо!

    @mmkamron@mmkamron Жыл бұрын
    • Думаю, стоит 😚 Я постарался минимизировать количество воды, и очень долго работал над структурой. Надеюсь, не зря)

      @nikolay_tuzov@nikolay_tuzov Жыл бұрын
    • Посмотрел на одном дыхании, все четко и без воды👍Еще раз благодарю за этот прекрасный разбор каналов.

      @mmkamron@mmkamron Жыл бұрын
  • Моё уважение! Очень классное объяснение!

    @stanislav3827@stanislav3827 Жыл бұрын
  • Спасибо огромное за ролик! ❤ Вот это я понимаю разбор, вот это уровень! Отлично переплетённые части анимации, уточнений, ухода в самую маковку кодовой базы и ёмких лаконичных выводов! Как всегда достаточно полно, чтобы понять и главное понять куда двигаться и вовремя сокращено, чтобы не перезагрузить в усмерть - это талан, и я рад, что вы, Старший разработчик категории 2, им обладаете xD Жду ролик про Планировщик, уверен в качестве! ¡Buena suerte en México, amigo! ❤

    @user-pt4iz2py6k@user-pt4iz2py6k Жыл бұрын
  • Николай, у вас талант объяснять, и понятно, что требуется очень много времени на подготовку даже небольшого видео

    @phnxbr@phnxbr10 ай бұрын
  • Николай, спасибо за труд! Очень интересно про атомики подробнее

    @beyond6596@beyond6596 Жыл бұрын
  • Спасибо большое. Читал статьи, документацию, после твоего видео все встало на места.

    @bambalbino@bambalbino3 ай бұрын
  • Невероятно крутой видос, много полезного материала, объясняемого не то что бы сложным языком. Сейчас как раз готовлюсь к собесу на го дева, очень помогло, спасибо!

    @denissokolov4029@denissokolov4029 Жыл бұрын
  • Классное видео, спасибо! После этого видео стал лучше понимать материал про каналы из других источников, что улучшило понимание в целом

    @user-mx9pu5fb6v@user-mx9pu5fb6v Жыл бұрын
  • Очень качественный контент. Заочно поставил лайк!

    @relax9332@relax9332 Жыл бұрын
  • Контент в кайф. Давай еще. Давай, давай, давай.

    @kwynto@kwynto Жыл бұрын
  • Спасибо за виде! Очень познавательно

    @whiteniga9489@whiteniga9489 Жыл бұрын
  • Спасибо за огромню работу

    @liteleak4049@liteleak40495 ай бұрын
  • всё понятно, большое спасибо!

    @user-bc8mo2ml1z@user-bc8mo2ml1z Жыл бұрын
  • Благодарю, лайк авансом!

    @user-vt4fr8pu3d@user-vt4fr8pu3d Жыл бұрын
  • Spasibo!

    @noob-mp7jo@noob-mp7jo9 ай бұрын
  • большой труд - и очень понятно, благодарю!

    @grigoriirochev440@grigoriirochev440 Жыл бұрын
  • Супер! Спасибо огромное!

    @user-ee1lx1pe7n@user-ee1lx1pe7n Жыл бұрын
  • Спасибо за видео очень классное видео побольше бы таких Про то как корутины или потоки работают

    @DJamalGreaterThenMe@DJamalGreaterThenMe3 ай бұрын
  • Спасибо! Отличная подача материала. Сначала комиксы и объяснение, затем разбор кода. Респект!

    @maxreshe6410@maxreshe6410 Жыл бұрын
  • Ждём видео про планировщик от Тузова 😊

    @andreypalamarchuk472@andreypalamarchuk4729 ай бұрын
  • Николай, отличное видео. Жду видео про атомики на разных архитектурах

    @user-cu9yp3me5y@user-cu9yp3me5y Жыл бұрын
  • Спасибо большое за видео, это лучшие видео по устройству го что я видел 👍🏻👍🏻👍🏻👍🏻👍🏻

    @sergey5758@sergey575817 күн бұрын
  • Так-с, интересно, подписался

    @PavPetukhov@PavPetukhov5 ай бұрын
  • Редко я такое пишу. Молодец! Все наглядно.

    @abonentnumber3283@abonentnumber32839 ай бұрын
  • Спасибо большое!

    @user-tv2hs5rs4t@user-tv2hs5rs4t Жыл бұрын
  • Очень спасибо!

    @a98cb985@a98cb985 Жыл бұрын
  • Спасибо 🙏🏻❤️

    @invisibleinvisible83@invisibleinvisible83 Жыл бұрын
  • Гениальнейшее видео, все понятно!

    @Dantesik1@Dantesik1 Жыл бұрын
  • Уже думал читать статью, а тут видео вовремя

    @virtualriot4062@virtualriot4062 Жыл бұрын
  • Большое спасибо за видео, все очень понятно и интересно) Подскажите пожалуйста, где можно ознакомиться с такими подробностями о языке?

    @mrmarkovniktgv3058@mrmarkovniktgv30589 ай бұрын
  • Дуже якісне відео. Автор топчик, кожна деталь розгорнута, за ці 40 хвилин автор розкрив фундамент з яким можна вільно програмувати. Дуже дякую тобі авторе ❤

    @riendlyf@riendlyf2 ай бұрын
  • Спасибо за видео

    @andreipopov2700@andreipopov2700 Жыл бұрын
  • спасибо- у вас талант расказывать про иные измерения инопланетным языком)- вот ненашто даже возразить)

    @user-eo9td2bj5q@user-eo9td2bj5q9 ай бұрын
  • годно!)

    @ArtemCYOU@ArtemCYOU Жыл бұрын
  • Ооочень крутое видео!

    @Kuchaian@Kuchaian Жыл бұрын
  • Очень интересно было бы послушать про concurrency в go простым языком. Не так много доступных ресурсов на эту тему и сама тема достаточно сложна)

    @kekstroke@kekstroke Жыл бұрын
  • Это вам не "весь go за 20 минут"

    @Maxlyaptsev@Maxlyaptsev Жыл бұрын
  • Николай, про атомик очень интересно! Как это все устроено, почему работает именно так. Большое спасибо!

    @puzz1372@puzz1372 Жыл бұрын
  • Большое спасибо за отличные, подробные объяснения! 😍😍😍

    @elvirakharunova1589@elvirakharunova15893 ай бұрын
  • топ контент !!!

    @user-hd9hw7nl1n@user-hd9hw7nl1n Жыл бұрын
  • Расскажи ещё про разницу string aka []byte. В чем преимущества той и другой структуры, в чем разница, когда использовать , и что происходит при обратной конвертации)

    @mjeksonmjekson4469@mjeksonmjekson4469 Жыл бұрын
  • контент - бомба

    @emotional_stuff@emotional_stuff Жыл бұрын
  • Привет! Очень круто! Продолжай! Вопрос, в какой проге делать такие красивые картинки и схемы?

    @ronalddavilla5602@ronalddavilla5602 Жыл бұрын
    • Схемы в основном тут делаю: excalidraw.com Но часть приходится рисовать прямо в PowerPoint, тогда меньше возни с анимацией. Гоферов просто в интернете нахожу.

      @nikolay_tuzov@nikolay_tuzov Жыл бұрын
  • отличная подача материала, а еще отличные подкасты с крутыми ребятами, не забрасывай, пожалуйста, это

    @user-zx4rj1gs4c@user-zx4rj1gs4c Жыл бұрын
  • Один момент не доконца понмаю, после парковки горутину, насколько я понимаю работу планировщика, она отправляется в глобальную очередь, соответственно после её пробуждения она возвращается в очередь (fifo/lifo?) на какой-либо процессор или там не все так просто?

    @user-fe6pi9vb6h@user-fe6pi9vb6h9 ай бұрын
  • Очень достойная обучалка-объяснялка, всё понятно и доступно, спасибо.

    @MicaelAlastor@MicaelAlastor10 ай бұрын
  • я пока просмотрел только 3 минуты, но мне уже нравится

    @user-tt3xw7cs5s@user-tt3xw7cs5s Жыл бұрын
  • Блин, очень очень круто и понятно всё рассказал, делай свой курс по Го.)

    @RomanAlexandrov@RomanAlexandrov10 ай бұрын
  • Видео топ! Но у меня чуть глаза не вытекли, когда резко переключилась IDE на белый фон 😵‍💫

    @germanzak@germanzak Жыл бұрын
  • Николай, вы ах*eнны!Спасибо за детализацию!

    @proger150@proger15010 ай бұрын
  • Спасибо за видео! Каналы перестали казаться чем-то инопланетным :) Вот такой вопрос возник: если по сути дела каналы реализованы отдельной библиотекой, и эту структуру может повторить любой разработчик, то зачем в го отдельный синтаксис чтения/записи в канал (оператор

    @user-nc8tl5cv6k@user-nc8tl5cv6k11 ай бұрын
  • Наконец человек не делает вид, а на самом деле знает что такое го

    @user-yt5qk6fi8m@user-yt5qk6fi8m4 ай бұрын
  • ролик бомба, наверно лучший гофер в рус ютубе

    @romankonovalov2588@romankonovalov258811 ай бұрын
  • а что если в sendq несколько спящих горутин. Условно одна спящая горутина с нужными данными, а другая горутина с абсолютно другими данными, что в этом случае ? Или в качестве спящей горутины берется только самая последняя горутина.

    @lauhG3@lauhG38 ай бұрын
  • Николай, какую IDE ты используешь?

    @plush_penguin@plush_penguin Жыл бұрын
    • GoLand от компании JetBrains

      @nikolay_tuzov@nikolay_tuzov Жыл бұрын
  • Привет! Классные у тебя разборы, разбери плз как работает планировщик go 1.20, а то я не нашел нормального урока

    @orifdjonergashev9472@orifdjonergashev9472 Жыл бұрын
    • Такой ролик как раз в процессе сейчас

      @nikolay_tuzov@nikolay_tuzov Жыл бұрын
  • Скажите, в каком редакторе автор демонстрирует этот урок? Тоже начал бы такой использовать, где столько информации внутренней и sandbox.

    @SWOsong@SWOsong6 ай бұрын
    • Это GoLand - IDE от JetBrains. Он платный, но есть еще VSCode - бесплатный и тоже хороший. Я думаю, там всё это тоже есть.

      @nikolay_tuzov@nikolay_tuzov6 ай бұрын
    • @@nikolay_tuzov Спасибо! Николай, как вы считаете, должен ли голангер по-умолчанию уметь работать с PostgreSQL, ElasticSearch, Mongo при собесе? У меня 90% отказов из-за отсутствия опыта по базам, но я всегда юзал самописные в своих разработках, а впрок учить просто так нет желания, да и не запомнится без долгой практики.

      @SWOsong@SWOsong6 ай бұрын
  • Про select не расказано как паркуется горутина если ни один из кейсов не сработает, ведь каналов в select может быть несколько. И как тогда просыпается горутина если ее будят по любому каналу и как она защищает себя от того, что проснулась, а возможности писать/читать уже нет потому что конкурентная горутина прочитала.

    @waffleboot@waffleboot7 ай бұрын
  • 7:40 Секундочку сами данные будут скопированны в канал или ссылки на данные?

    @736939@7369396 ай бұрын
    • Значения, конечно же. Но сами значения тоже могут быть указателями, тогда в канал будут скопированы указатели.

      @nikolay_tuzov@nikolay_tuzov6 ай бұрын
    • @@nikolay_tuzov Спасибо

      @736939@7369396 ай бұрын
  • Про атомики 100% нужно. Тема сложная, емкая

    @robotomize7123@robotomize7123 Жыл бұрын
  • Если канал заполнен и горутина пытается в неё что-то записать, то как именно горутина получает этот поток (переменную), чтобы потом завернуть в очередь sudog?

    @soundcloudlover@soundcloudlover9 ай бұрын
  • Запишите пожалуйста разъясняющий ролик про atomic, а то все дойти до них не могу. За ранее спасибо.

    @volodya-nrg@volodya-nrg Жыл бұрын
  • А как Reader-горутина прочитает данные из канала, если Sender перед тем как пойти спать не разблокировал мьютекс

    @leenur4749@leenur47492 ай бұрын
  • В момент когда горутина блокируется, кто разблокирет мьютекс? Сама горутина перед блокировкой?

    @user-jq3nx1gb2m@user-jq3nx1gb2m Жыл бұрын
  • Осталось не понятным, почему isClosed это int32, а не bool или хотя бы int8

    @OOOJohnJ@OOOJohnJ Жыл бұрын
    • Это очень хороший вопрос. Если кратко - потому что пакет атомик не поддерживает bool. Хотя, с 1.19 поддерживает, но на самом деле, под капотом там всем равно int. Можешь также почитать обсуждение в комментах к моему посту на эту же тему: t.me/ntuzov/26 А если захочется еще глубже копнуть, добро пожаловать в наш чатик Gopher Club, там у нас есть знатоки, которые помогут разобраться даже в самых низкоуровневых вопросах.

      @nikolay_tuzov@nikolay_tuzov Жыл бұрын
  • незаслуженно мало подписчиков и просмотров. и лайков

    @Hande_hoch@Hande_hoch Жыл бұрын
  • про атомики интересно было бы

    @slavanikulin8069@slavanikulin8069 Жыл бұрын
  • спасибо за простату) - ты умеешь довести человека до отчаяния)

    @user-eo9td2bj5q@user-eo9td2bj5q8 ай бұрын
  • Поделитесь первоисточником

    @artemrusinov3034@artemrusinov3034 Жыл бұрын
    • Их много, я для ролика прорабатываю много статьей, видосов, докладов

      @nikolay_tuzov@nikolay_tuzov Жыл бұрын
  • как то странно прозвучало "если вы используете каналы вам не надо задумываться об элементах синхронизации" что-то не то с причинно-следственными связями точно также я могу сказать "используя мютекс, мне не надо задумываться о каналах, как и в каком порядке их открывать/закрывать, как избегать записи/чтения в/с нил каналами, как избежать паники при работе с каналами и т.д.и т .п.". Что звучит еще более страшно ))) стоит задача, организовать работу двух и более потоков/горутин и в каждом конретном случае ты выбираешь какой элемент синхронизации использовать мютекс или что-то другое, в том числе канал

    @oleksandrdorogyh5265@oleksandrdorogyh5265 Жыл бұрын
    • А что не так с причинно-следственными связями? Давайте я задам несколько наводящих вопросов: Вот возьмём мапу - может ли несколько горутин одновременно добавлять в неё элементы? А в канал они могут одновременно писать? Почему? Если этого недостаточно, можем обсудить подробней в нашем чатике: t.me/+WyjmnP6la_QyYjAy Вести переписку в комментариях не очень удобно.

      @nikolay_tuzov@nikolay_tuzov Жыл бұрын
    • Если кратко - канал не является примитивом синхронизации. Канал сам использует примитив синхронизации, а именно - встроенный мьютекс. И благодаря этому, разработчику не требуется прикрывать канал внешним мьютексом. Надеюсь, так понятней.

      @nikolay_tuzov@nikolay_tuzov Жыл бұрын
  • @nikolay_tuzov а mutex точно полностью блокирует буферизированный канал? Чтение невозможно одновременно с записью?

    @N4g1b4t0r@N4g1b4t0r2 ай бұрын
  • Каналы без горутин - это что-то из серии велосипед с одним колесом

    @timurkash@timurkash Жыл бұрын
KZhead