Junior — Middle
Hogyan lehet kényszeríteni több futó goroutine leállítását Go-ban?
sobes.tech MI
Válasz az MI-től
Go nyelven a több futó goroutine erőltetett leállításához általában a context (context.Context) segítségével végzett megszakítási mechanizmust használják.
Fő ötlet:
- Létrehozunk egy megszakítható kontextust (
context.WithCancelvagycontext.WithTimeout). - Minden goroutine ezt a kontextust kapja, és időről időre ellenőrzi, hogy leállították-e.
- A leállítási függvény (
cancel()) hívásakor minden goroutine megkapja a jelet, és helyesen befejeződhet.
Példa:
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 leállítva\n", id)
return
default:
// goroutine munka
time.Sleep(100 * time.Millisecond)
}
}
}(i)
}
// Egy idő után leállítjuk az összes goroutine-t
time.Sleep(1 * time.Second)
cancel()
// Várunk a befejezésre (pl. sync.WaitGroup segítségével)
Ez a megközelítés lehetővé teszi több goroutine központi kezelését, és elkerüli az ellenőrizetlen befejezési problémákat.