Какими основными сущностями оперирует модель конкурентности в Go?

Ответ

Модель конкурентности в Go построена на нескольких ключевых сущностях, которые работают вместе под управлением планировщика Go.

  1. Горутины (Goroutines)

    • Это основная единица конкурентного выполнения. Горутина — это легковесный поток, управляемый не операционной системой, а средой выполнения (runtime) Go.
    • Запускается с помощью ключевого слова go перед вызовом функции: go myFunction().
    • Стоимость создания горутины очень низка (начальный стек ~2 КБ), что позволяет создавать сотни тысяч и даже миллионы горутин в одном приложении.
  2. Каналы (Channels)

    • Основной механизм для коммуникации и синхронизации между горутинами. Они позволяют безопасно передавать данные от одной горутины к другой, следуя парадигме CSP (Communicating Sequential Processes).
  3. Примитивы синхронизации (пакет 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), обеспечивая высокий уровень параллелизма без прямого управления потоками со стороны разработчика.