Какие способы синхронизации горутин есть в Go?
Ответ от нейросети
sobes.tech AI
В Go для синхронизации горутин доступны несколько основных способов:
-
Каналы (channels) — основной и идиоматичный способ обмена данными и синхронизации. Горутинa может отправлять и получать значения через канал, что обеспечивает безопасную передачу данных и блокировку до готовности.
-
sync.WaitGroup — используется для ожидания завершения группы горутин. Позволяет главной горутине ждать, пока все дочерние завершатся.
-
sync.Mutex и sync.RWMutex — для защиты общих ресурсов от одновременного доступа, обеспечивая взаимное исключение.
-
sync.Cond — условная переменная для более сложной синхронизации, когда горутины ждут определённого условия.
-
atomic — пакет для атомарных операций над переменными, полезен для простых счётчиков и флагов без блокировок.
Пример использования WaitGroup и канала:
var wg sync.WaitGroup
ch := make(chan int)
wg.Add(1)
go func() {
defer wg.Done()
ch <- 42
}()
val := <-ch
wg.Wait()
fmt.Println(val)
Таким образом, выбор способа синхронизации зависит от задачи: каналы для передачи данных и сигналов, мьютексы для защиты разделяемых ресурсов, WaitGroup для ожидания завершения.