Sobes.tech
Назад к вопросам
Junior — Middle
73

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

Компании, где спрашивали
Mail.ruMail.ru

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

sobes.tech AI

Для корректной остановки горутин в Go часто используют пакет context. Создается контекст с возможностью отмены (context.WithCancel), который передается в горутину. Внутри горутины периодически проверяется состояние контекста через <-ctx.Done(). Когда вызывается функция отмены, канал Done() закрывается, и горутина может корректно завершить работу.

Пример:

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

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go worker(ctx)

    // через некоторое время останавливаем горутину
    time.Sleep(time.Second)
    cancel()
    time.Sleep(time.Millisecond * 100) // чтобы горутина успела завершиться
}

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