Многозадачность в Go реализована с помощью горутин (goroutines) и каналов (channels).
Горутины:
- Легковесные потоки, управляемые средой выполнения Go.
- Создаются ключевым словом
go перед вызовом функции.
- Занимают меньше памяти по сравнению с традиционными потоками ОС.
- Среда выполнения Go планирует их выполнение на доступных потоках ОС.
golang
Каналы:
- Типизированные конвейеры для обмена данными между горутинами.
- Используются для синхронизации и связи.
- Создаются с помощью функции
make(chan Type).
- Операторы
<- используются для отправки и получения данных.
golang
Планировщик Go:
- Многопоточный планировщик, который эффективно распределяет горутины по потокам ОС.
- Использует модель M:N (Many-to-Many): множество горутин (M) мультиплексируются на меньшее количество потоков ОС (N).
- Реализует технику work-stealing, где простаивающие потоки ОС могут "красть" готовые к выполнению горутины у других потоков.
Синхронизация:
- Помимо каналов, Go предоставляет стандартный пакет
sync для более низкоуровневой синхронизации, такой как мьютексы (sync.Mutex), RWMutex (sync.RWMutex) и группы ожидания (sync.WaitGroup).
Ключевая идея Go по параллелизму:
- "Не общайтесь по общей памяти, а делитесь памятью путем общения" (Do not communicate by sharing memory; instead, share memory by communicating). Это означает, что предпочтительным способом взаимодействия между горутинами является использование каналов, а не совместное использование изменяемых данных с явной блокировкой.