Sobes.tech
Назад к вопросам
Middle+
3

Какие способы синхронизации горутин есть в Go?

Компании, где спрашивали
YadroYadro

Ответ от нейросети

sobes.tech AI

В Go для синхронизации горутин доступны несколько основных способов:

  1. Каналы (channels) — основной и идиоматичный способ обмена данными и синхронизации. Горутинa может отправлять и получать значения через канал, что обеспечивает безопасную передачу данных и блокировку до готовности.

  2. sync.WaitGroup — используется для ожидания завершения группы горутин. Позволяет главной горутине ждать, пока все дочерние завершатся.

  3. sync.Mutex и sync.RWMutex — для защиты общих ресурсов от одновременного доступа, обеспечивая взаимное исключение.

  4. sync.Cond — условная переменная для более сложной синхронизации, когда горутины ждут определённого условия.

  5. 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 для ожидания завершения.