Ответ
Модель конкурентности в Go построена на нескольких ключевых сущностях, которые работают вместе под управлением планировщика Go.
Горутины (Goroutines)
- Это основная единица конкурентного выполнения. Горутина — это легковесный поток, управляемый не операционной системой, а средой выполнения (runtime) Go.
- Запускается с помощью ключевого слова
go
перед вызовом функции:go myFunction()
. - Стоимость создания горутины очень низка (начальный стек ~2 КБ), что позволяет создавать сотни тысяч и даже миллионы горутин в одном приложении.
Каналы (Channels)
- Основной механизм для коммуникации и синхронизации между горутинами. Они позволяют безопасно передавать данные от одной горутины к другой, следуя парадигме CSP (Communicating Sequential Processes).
Примитивы синхронизации (пакет
sync
)- Используются в модели конкурентности на основе общей памяти.
sync.Mutex
иsync.RWMutex
: Для защиты критических секций от одновременного доступа.sync.WaitGroup
: Для ожидания завершения работы группы горутин.sync.Once
: Для гарантии, что определённый код выполнится только один раз.sync.Cond
: Механизм условных переменных для более сложных сценариев синхронизации.
Модель планировщика M:N
Go использует модель планирования M:N, где M горутин выполняются на N потоках операционной системы (M > N
).
- G (Goroutine): Сама горутина с её стеком и состоянием.
- M (Machine): Поток операционной системы, управляемый Go runtime.
- P (Processor): Контекст для выполнения горутин. У каждого
P
есть своя очередь локальных горутин. КоличествоP
по умолчанию равно количеству ядер ЦП (runtime.GOMAXPROCS
).
Планировщик Go эффективно распределяет готовые к выполнению горутины (G) по доступным потокам ОС (M), обеспечивая высокий уровень параллелизма без прямого управления потоками со стороны разработчика.