Sobes.tech
Back to questions
Senior
1

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

Companies where asked
СБК ПАРУС

Answer from AI

sobes.tech AI

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

  1. Использование каналов для сигналов остановки — горутина слушает канал, и при получении сигнала завершает работу.

  2. Контекст (context.Context) — передача контекста с возможностью отмены, горутина периодически проверяет ctx.Done() и завершает работу при отмене.

  3. Флаги или переменные состояния — горутина проверяет значение переменной и завершает работу, если нужно.

Пример с контекстом:

ctx, cancel := context.WithCancel(context.Background())

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

// В какой-то момент вызываем cancel(), чтобы остановить горутину
cancel()

Важно, что горутина должна сама корректно реагировать на сигнал завершения, иначе она продолжит работать.