> Как послать сигнал в канал, чтобы все горутины получили уведомление о завершении работы в Go (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: ЦУМ
Стек: Go
> Пример ответа
В Go для оповещения всех горутин о завершении работы используется закрытие канала (close(ch)). Когда канал закрывается, все горутины, ожидающие чтения из него, немедленно получают нулевое значение. Это единственный способ разослать сигнал всем слушателям одновременно.
Пример реализации:
GOpackage mainimport ("fmt""sync""time")func worker(id int, done <-chan struct{}, wg *sync.WaitGroup) {defer wg.Done()for {select {case <-done:fmt.Printf("Worker %d завершает работу\n", id)returndefault:// Имитация работыfmt.Printf("Worker %d работает...\n", id)time.Sleep(500 * time.Millisecond)}}}func main() {done := make(chan struct{})var wg sync.WaitGroup// Запуск 3 горутинfor i := 1; i <= 3; i++ {wg.Add(1)go worker(i, done, &wg)}// Даем поработать 2 секундыtime.Sleep(2 * time.Second)// Закрытие канала - сигнал всем горутинамclose(done)// Ожидание завершения всех горутинwg.Wait()fmt.Println("Все горутины завершены")}
Ключевые моменты:
- Используется канал с пустой структурой (
chan struct{}) для минимального потребления памяти. - Закрытие канала через
close(done)- это broadcast-сигнал. - Горутины проверяют сигнал через
selectсcase <-done. sync.WaitGroupгарантирует, что main дождется завершения всех горутин.
Этот паттерн является идиоматичным для Go и эффективно решает задачу оповещения множества горутин.
> Похожие задачи по Go
Как принимаются решения о внедрении изменений
Что лучше: выбрать из базы одним запросом тысячу id или сделать тысячу запросов по одному id
Как работает перебор мапы в цикле в Go и является ли он случайным
Как устроена многозадачность в Go и какой механизм планирования используется
> Похожие задачи по backend
Как принимаются решения о внедрении изменений
Что лучше: выбрать из базы одним запросом тысячу id или сделать тысячу запросов по одному id
Как работает перебор мапы в цикле в Go и является ли он случайным
Как устроена многозадачность в Go и какой механизм планирования используется
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью