Junior — Middle
Kaip priverstinai sustabdyti kelias veikiančias goroutines Go kalboje?
sobes.tech AI
Atsakymas iš AI
Go kalboje dažniausiai naudojamas mechanizmas, kai keli veikiantys gorutinai yra priverstinai sustabdomi naudojant konteksto (context.Context) atšaukimo mechanizmą.
Pagrindinė idėja:
- Sukuriamas kontekstas su atšaukimu (
context.WithCancelarbacontext.WithTimeout). - Kiekviena gorutina priima šį kontekstą ir periodiškai tikrina, ar jis nebuvo atšauktas.
- Kai iškviečiama atšaukimo funkcija (
cancel()), visos gorutinos gauna signalą ir gali tinkamai užbaigti veiklą.
Pavyzdys:
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 sustabdyta\n", id)
return
default:
// gorutinos darbas
time.Sleep(100 * time.Millisecond)
}
}
}(i)
}
// Po tam tikro laiko sustabdom visus gorutinas
time.Sleep(1 * time.Second)
cancel()
// Laukiame jų užbaigimo (pvz., naudojant sync.WaitGroup)
Šis požiūris leidžia centralizuotai valdyti kelių gorutinos sustabdymą ir išvengti nekontroliuojamo užbaigimo problemų.