> Как уведомить горутины в Go о необходимости завершения при получении первого результата (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Black Wall Group (BWG)
Стек: Go
> Пример ответа
В Go для уведомления горутин о необходимости завершения при получении первого результата можно использовать комбинацию контекста (context.Context) с функцией отмены и канала для результата. Основная идея: запускаем несколько горутин, передаём им общий контекст с отменой. Как только одна из горутин возвращает результат, вызываем функцию отмены, что сигнализирует остальным горутинам завершиться.
Пример реализации:
GOpackage mainimport ("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.WaitGroupfor i := 1; i <= 5; i++ {wg.Add(1)go worker(ctx, i, resultChan, &wg)}// Ожидаем первый результатresult := <-resultChanfmt.Println("Получен:", result)// Отменяем контекст - все горутины получат сигнал завершенияcancel()wg.Wait() // дожидаемся завершения всех горутинclose(resultChan)}
Ключевые моменты:
context.WithCancelсоздаёт контекст, который можно отменить.- Канал
resultChanс буфером 1 гарантирует, что первый результат будет принят без блокировки. - После получения результата вызов
cancel()распространяет сигнал отмены черезctx.Done()во все горутины. - Использование
sync.WaitGroupпозволяет дождаться корректного завершения всех горутин.
Этот паттерн эффективен для задач, где важен только первый успешный ответ (например, параллельные запросы к нескольким серверам).
> Похожие задачи по Go
Можно ли шарить данные между потоками
Как спроектировать систему url shortener на уровне микросервисов
Используешь ли багтрекинговые системы
Для чего используется пакет errors в Go
> Похожие задачи по backend
Можно ли шарить данные между потоками
Как спроектировать систему url shortener на уровне микросервисов
Используешь ли багтрекинговые системы
Для чего используется пакет errors в Go
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью