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