Sobes.tech
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.WithCancel vagy context.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.