Junior — Middle
Как правилно да спрете изпълняваща се goroutine, ако е необходимо да приключи въз основа на външен сигнал или условие, дори ако резултатът все още не е получен?
sobes.tech AI
Отговор от 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.