Junior — Middle
Jak násilím zastavit několik běžících gorutin v Go?
sobes.tech AI
Odpověď od AI
V jazyce Go se k nucenému zastavení několika běžících gorutin obvykle používá mechanismus zrušení přes kontext (context.Context).
Hlavní myšlenka:
- Vytvoří se kontext s možností zrušení (
context.WithCancelnebocontext.WithTimeout). - Každá gorutina přijímá tento kontext a pravidelně kontroluje, zda nebyl zrušen.
- Při volání funkce zrušení (
cancel()) všechny gorutiny obdrží signál a mohou se správně ukončit.
Příklad:
ctx, cancel := context.WithCancel(context.Background())
for i := 0; i < 5; i++ {
go func(id int) {
for {
select {
case <-ctx.Done():
fmt.Printf("Gorutina %d zastavena\n", id)
return
default:
// práce gorutiny
time.Sleep(100 * time.Millisecond)
}
}
}(i)
}
// Po nějaké době zastavíme všechny gorutiny
time.Sleep(1 * time.Second)
cancel()
// Čekáme na jejich ukončení (například pomocí sync.WaitGroup)
Tento přístup umožňuje centrálně řídit zastavení více gorutin a vyhýbat se problémům s nekontrolovaným ukončením.