Sobes.tech
Назад к вопросам
Junior — Middle
74

Что произойдет первым: обработка сигнала отмены или завершение записи, если они происходят одновременно в канал?

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

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

sobes.tech AI

В Go при одновременной попытке отправить сигнал отмены (например, через закрытие канала или отправку значения) и завершить запись в канал, порядок обработки не гарантируется и зависит от планировщика горутин и состояния каналов. Каналы в Go синхронизируют операции, но если две операции происходят одновременно, одна из них будет выполнена первой, но это не определено спецификацией.

То есть, если горутина пытается записать в канал, а другая горутина одновременно закрывает этот канал или отправляет сигнал отмены, то какая операция будет обработана первой — неопределенно. Важно проектировать логику так, чтобы не полагаться на порядок таких одновременных событий.

Пример:

cancel := make(chan struct{})
data := make(chan int)

// Горутина, которая слушает cancel
go func() {
    select {
    case <-cancel:
        fmt.Println("Отмена получена")
    case v := <-data:
        fmt.Println("Получено значение", v)
    }
}()

// Одновременная отправка
close(cancel) // сигнал отмены
// или
// data <- 42 // запись в канал

В этом примере, какая ветка сработает первой — зависит от планировщика.