Перейти Внутренние
Каковы ограничения каналов Go?
По размеру сообщения, максимальному распределению и производительности
Вы когда-нибудь задумывались об ограничениях каналов Go? Я решил заглянуть в golang repo, чтобы узнать, как создаются каналы.
Вот что я узнал.
Создание канала
Я начал с поиска кода функции, создающей канал. Неудивительно, что я смог найти его в файле runtime/chan.go
.
Функция makechannel
имеет следующую сигнатуру.
Затем давайте рассмотрим, что такое типы chantype
и hchan
.
Типы каналов
chantype
— это оболочка для структуры _type
.
Тип _type
является базовой структурой для любого типа go и выглядит следующим образом.
Тогда давайте посмотрим на тип hchan
.
Давайте двигаться дальше и рассмотрим функцию makechan
.
Размер сообщения
Когда мы начинаем с начала функции makechan
. Мы видим, что он проверяет размер будущего сообщения канала.
Максимальный размер сообщения составляет 2¹⁶ байта или 64 килобайта.
Максимальное распределение
Следующим шагом будет проверка размера памяти, которую можно выделить для нового канала.
Какой размер maxAlloc
?
maxAlloc
определяет максимальный теоретически допустимый размер памяти. В 64-разрядных Unix-подобных системах это 2⁴⁷ байт (~140 терабайт).
Тем не менее, он позволяет выделить до 140 терабайт. Вы столкнетесь с проблемами памяти, если попытаетесь это сделать 😄.
Производительность
С помощью следующего наивного теста мы можем измерить верхние пределы для операций отправки/получения.
Операции отправки и получения в основном тратят время на переключение контекста горутины. На моей машине это число стабильно ‹100 нс.
➜ channels git:(main) ✗ go test -bench=. goos: darwin goarch: arm64 pkg: pavel-fokin/go-patterns/concurrency/channels BenchmarkUnbufferedChannelInt-8 11091662 107.5 ns/op BenchmarkBufferedChannelInt-8 15082126 80.11 ns/op PASS ok pavel-fokin/go-patterns/concurrency/channels 7.021s
Последние мысли
Изучение внутренностей Go, безусловно, того стоит. Вы можете не только увидеть детали реализации, но и ознакомиться с лучшими практиками.
Удачного кодирования!
Дальнейшие чтения
Если вам понравилась эта статья, вас может заинтересовать следующее.