> Как уведомить горутины в Go о необходимости завершения при получении первого результата (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Black Wall Group (BWG)

Стек: Go

> Пример ответа

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

Пример реализации:

GO
package main
import (
"context"
"fmt"
"sync"
"time"
)
func worker(ctx context.Context, id int, resultChan chan<- string, wg *sync.WaitGroup) {
defer wg.Done()
select {
case <-time.After(time.Duration(id) * time.Second): // симуляция работы
select {
case resultChan <- fmt.Sprintf("Результат от горутины %d", id):
default:
}
case <-ctx.Done():
fmt.Printf("Горутина %d завершена досрочно\n", id)
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
resultChan := make(chan string, 1) // буферизированный канал для первого результата
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go worker(ctx, i, resultChan, &wg)
}
// Ожидаем первый результат
result := <-resultChan
fmt.Println("Получен:", result)
// Отменяем контекст - все горутины получат сигнал завершения
cancel()
wg.Wait() // дожидаемся завершения всех горутин
close(resultChan)
}

Ключевые моменты:

  • context.WithCancel создаёт контекст, который можно отменить.
  • Канал resultChan с буфером 1 гарантирует, что первый результат будет принят без блокировки.
  • После получения результата вызов cancel() распространяет сигнал отмены через ctx.Done() во все горутины.
  • Использование sync.WaitGroup позволяет дождаться корректного завершения всех горутин.

Этот паттерн эффективен для задач, где важен только первый успешный ответ (например, параллельные запросы к нескольким серверам).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью