> Как прервать выполнение goroutine без остановки главной программы в Go (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: InDrive
Стек: Go
> Пример ответа
В Go для безопасного прерывания выполнения goroutine извне без остановки главной программы используется паттерн с каналом для сигнала завершения (done channel). Основная идея - передать в goroutine канал, который закрывается, когда нужно остановить её выполнение. Goroutine периодически проверяет этот канал через select.
Пример:
GOpackage mainimport ("fmt""time")func worker(done <-chan struct{}) {for {select {case <-done:fmt.Println("Горутина завершена")returndefault:// Выполнение полезной работыfmt.Println("Работаю...")time.Sleep(500 * time.Millisecond)}}}func main() {done := make(chan struct{})go worker(done)time.Sleep(2 * time.Second)close(done) // Сигнал завершенияtime.Sleep(1 * time.Second)fmt.Println("Главная программа продолжает работу")}
Здесь done - небуферизированный канал пустой структуры. Когда главная программа вызывает close(done), все горутины, ожидающие чтения из этого канала, получают нулевое значение и могут корректно завершиться. Главная программа при этом не блокируется и продолжает выполнение. Этот подход гарантирует отсутствие утечек горутин и позволяет управлять их жизненным циклом.
> Похожие задачи по Go
Почему для закрытия канала и ожидания работы горутин используется отдельная горутина, а не main функция?
Как оптимизировать память при слиянии массивов?
Какие инструменты для профилирования сервисов на Go существуют и как их использовать
Какие способы общения между goroutine существуют в Go
> Похожие задачи по backend
Почему для закрытия канала и ожидания работы горутин используется отдельная горутина, а не main функция?
Как оптимизировать память при слиянии массивов?
Какие инструменты для профилирования сервисов на Go существуют и как их использовать
Какие способы общения между goroutine существуют в Go
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью