Глава 10 Каналы и select
К этой главе прилагается доклад: YouTube, слайды Google Slides.
«Не общайтесь через разделяемую память — вместо этого разделяйте память через общение.» Эта широко цитируемая максима выражает суть философии конкурентности в Go. Канал — её воплощение: он объединяет синхронизацию и передачу данных в единое целое. Интеллектуальная родословная CSP была изложена в 1.3 Взаимодействующие последовательные процессы, и повторять её здесь мы не будем. Вместо этого данная глава сосредоточена на том, как каналы и select реализованы в рантайме: как канал выглядит в памяти, как единственная операция отправки или получения сводит две горутины в рандеву, как закрытие канала работает как широковещательная рассылка, как select честно и без дедлоков выбирает один путь из нескольких, почему этот механизм построен на блокировках и как он соотносится с моделью памяти.
- 10.1 Каналы и инженерная реализация CSP
- 10.2 hchan: внутреннее устройство канала
- 10.3 Отправка, получение и прямая передача
- 10.4 Семантика закрытия канала
- 10.5 Реализация select
- 10.6 Модель памяти и эволюция в сторону lock-free
- 10.7 Инженерная практика и сравнение с другими языками
Эта максима точно определяет место канала в модели конкурентности Go: канал — не очередной мьютекс, а средство оркестрации, организующее «кто, что, кому и когда передаёт» между несколькими горутинами в читаемую структуру. Интригует то, что способ, которым рантайм реализует этот слой оркестрационной семантики, — это как раз тот самый мьютекс с другого конца максимы. В этой главе мы проследим это противоречие до самого конца, чтобы ясно увидеть, как абстракция «оркестрации через коммуникацию» в конечном счёте опирается на реализацию «сериализации через блокировки».