Sobes.tech
Back to questions
Junior — Middle
78

Каким образом можно корректно остановить запусканную горутину, если необходимо, чтобы завершение произошло в зависимости от внешнего сигнала или условия, даже если результат еще не получен?

Companies where asked
IDT

Answer from AI

sobes.tech AI

Для корректной остановки запущенной горутины по внешнему сигналу или условию в Go обычно используют контекст (context.Context) или каналы для передачи сигнала отмены.

Пример с использованием контекста:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // Получен сигнал отмены, завершаем горутину
            return
        default:
            // Выполняем работу
        }
    }
}

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

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

Такой подход позволяет горутине регулярно проверять, не был ли отправлен сигнал остановки, и завершаться корректно, даже если результат еще не получен. Аналогично можно использовать канал для передачи сигнала остановки, но context является более идиоматичным и удобным способом в Go.