Sobes.tech
Junior — Middle

Ako nútene zastaviť viac bežiacich gorutín v Go?

sobes.tech AI

Odpoveď od AI

V jazyku Go sa na nútené zastavenie viacerých bežiacich gorutín zvyčajne používa mechanizmus zrušenia cez kontext (context.Context).

Hlavná myšlienka:

  • Vytvorí sa kontext s možnosťou zrušenia (context.WithCancel alebo context.WithTimeout).
  • Každá gorutina prijíma tento kontext a pravidelne kontroluje, či nebol zrušený.
  • Pri volaní funkcie zrušenia (cancel()) všetky gorutiny dostanú signál a môžu sa správne ukončiť.

Prí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 zastavená\n", id)
                return
            default:
                // práca gorutiny
                time.Sleep(100 * time.Millisecond)
            }
        }
    }(i)
}

// Po určitom čase zastavíme všetky gorutiny
time.Sleep(1 * time.Second)
cancel()

// Čakáme na ich ukončenie (napríklad pomocou sync.WaitGroup)

Tento prístup umožňuje centralizované riadenie zastavenia viacerých gorutín a vyhýba sa problémom s nekontrolovaným ukončením.