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

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

Компании: ЦУМ

Стек: Go

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

Для передачи сигнала закрытия 15 горутинам в Go используется пакет context с функцией WithCancel. Создаётся родительский контекст, из которого через context.WithCancel получаем дочерний контекст и функцию отмены cancel. Эта функция передаётся в каждую горутину, которая в своём цикле или длительной операции проверяет канал ctx.Done() через select.

Пример:

GO
package main
import (
"context"
"fmt"
"sync"
"time"
)
func worker(ctx context.Context, id int, wg *sync.WaitGroup) {
defer wg.Done()
for {
select {
case <-ctx.Done():
fmt.Printf("Горутина %d завершена\n", id)
return
default:
// Имитация работы
time.Sleep(100 * time.Millisecond)
}
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
var wg sync.WaitGroup
// Запуск 15 горутин
for i := 0; i < 15; i++ {
wg.Add(1)
go worker(ctx, i, &wg)
}
// Имитация работы через 2 секунды
time.Sleep(2 * time.Second)
cancel() // Отправка сигнала закрытия всем горутинам
wg.Wait() // Ожидание завершения всех горутин
fmt.Println("Все горутины завершены")
}

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

  • cancel() вызывается один раз, но сигнал получают все горутины, слушающие ctx.Done().
  • Используется sync.WaitGroup для гарантии завершения всех горутин перед выходом из main.
  • В горутине обязателен select с проверкой ctx.Done(), иначе сигнал будет проигнорирован.

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

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