Перейти Внутренние

Каковы ограничения каналов 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, безусловно, того стоит. Вы можете не только увидеть детали реализации, но и ознакомиться с лучшими практиками.

Удачного кодирования!

Дальнейшие чтения

Если вам понравилась эта статья, вас может заинтересовать следующее.