Junior — Middle
Kako na silu zaustaviti više pokrenutih gorutina u Go?
sobes.tech АИ
Одговор од АИ
У Go-у, за принудно заустављање више активних goroutine-ова, обично се користи механизам отказа преко контекста (context.Context).
Главна идеја:
- Креира се контекст са отказом (
context.WithCancelилиcontext.WithTimeout). - Сваку goroutine прихвата овај контекст и периодично проверава да ли је отказан.
- При позиву функције за отказ (
cancel()), све goroutine-ове добијају сигнал и могу се правилно завршити.
Пример:
ctx, cancel := context.WithCancel(context.Background())
for i := 0; i < 5; i++ {
go func(id int) {
for {
select {
case <-ctx.Done():
fmt.Printf("Goroutine %d заустављена\n", id)
return
default:
// рад goroutine-а
time.Sleep(100 * time.Millisecond)
}
}
}(i)
}
// После одређеног времена, заустављамо све goroutine-ове
time.Sleep(1 * time.Second)
cancel()
// Чекамо да се заврше (нпр. коришћењем sync.WaitGroup)
Овај приступ омогућава централизовано управљање заустављањем више goroutine-ова и избегава проблеме са неконтролисаним завршетком.