Sobes.tech
Junior — Middle
103

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

Сұралған компаниялар
IDT

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.