Go under the hood
Go: Under the Hood

Глава 10 Каналы и select

К этой главе прилагается доклад: YouTube, слайды Google Slides.

«Не общайтесь через разделяемую память — вместо этого разделяйте память через общение.» Эта широко цитируемая максима выражает суть философии конкурентности в Go. Канал — её воплощение: он объединяет синхронизацию и передачу данных в единое целое. Интеллектуальная родословная CSP была изложена в 1.3 Взаимодействующие последовательные процессы, и повторять её здесь мы не будем. Вместо этого данная глава сосредоточена на том, как каналы и select реализованы в рантайме: как канал выглядит в памяти, как единственная операция отправки или получения сводит две горутины в рандеву, как закрытие канала работает как широковещательная рассылка, как select честно и без дедлоков выбирает один путь из нескольких, почему этот механизм построен на блокировках и как он соотносится с моделью памяти.

Channels orchestrate; mutexes serialize.
-- Rob Pike, "Go Proverbs", Gopherfest SV 2015

Эта максима точно определяет место канала в модели конкурентности Go: канал — не очередной мьютекс, а средство оркестрации, организующее «кто, что, кому и когда передаёт» между несколькими горутинами в читаемую структуру. Интригует то, что способ, которым рантайм реализует этот слой оркестрационной семантики, — это как раз тот самый мьютекс с другого конца максимы. В этой главе мы проследим это противоречие до самого конца, чтобы ясно увидеть, как абстракция «оркестрации через коммуникацию» в конечном счёте опирается на реализацию «сериализации через блокировки».