Sobes.tech
Назад к вопросам
Senior
3

Как можно остановить выполнение горутины?

Компании, где спрашивали
Алабуга

Ответ от нейросети

sobes.tech AI

В Go нет встроенного способа принудительно остановить горутину извне, так как горутины не имеют метода kill или stop. Остановка горутины достигается кооперативно — сама горутина должна периодически проверять сигнал остановки и корректно завершаться.

Основные подходы:

  1. Использование канала для сигнала остановки:
stop := make(chan struct{})

go func() {
    for {
        select {
        case <-stop:
            fmt.Println("Горутина остановлена")
            return
        default:
            // работа горутины
        }
    }
}()

// Чтобы остановить горутину:
close(stop)
  1. Использование контекста (context.Context):
ctx, cancel := context.WithCancel(context.Background())

go func(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Горутина завершает работу")
            return
        default:
            // работа
        }
    }
}(ctx)

// Для остановки:
cancel()

Таким образом, остановка горутины — это ответственность самой горутины, которая должна корректно реагировать на сигнал и завершаться.