> Как использовать пакет context для передачи сигнала закрытия 15 горутинам в Go (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: ЦУМ
Стек: Go
> Пример ответа
Для передачи сигнала закрытия 15 горутинам в Go используется пакет context с функцией WithCancel. Создаётся родительский контекст, из которого через context.WithCancel получаем дочерний контекст и функцию отмены cancel. Эта функция передаётся в каждую горутину, которая в своём цикле или длительной операции проверяет канал ctx.Done() через select.
Пример:
GOpackage mainimport ("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)returndefault:// Имитация работы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(), иначе сигнал будет проигнорирован.
> Похожие задачи по Go
Как программа определяет URL для выполнения запросов по списку
На каком языке написан компилятор Go
Какие алгоритмы балансировки подходят для распределенных систем без синхронизации
Для чего используется рефлексия в Go
> Похожие задачи по backend
Как программа определяет URL для выполнения запросов по списку
На каком языке написан компилятор Go
Какие алгоритмы балансировки подходят для распределенных систем без синхронизации
Для чего используется рефлексия в Go
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью