Sobes.tech
Junior — Middle

Cum poți opri forțat mai multe goroutines care rulează în Go?

sobes.tech AI

Răspuns de la AI

În Go, pentru a opri forțat mai multe goroutines în execuție, se folosește de obicei mecanismul de anulare prin intermediul contextului (context.Context).

Ideea principală:

  • Se creează un context cu anulare (context.WithCancel sau context.WithTimeout).
  • Fiecare goroutine primește acest context și verifică periodic dacă a fost anulat.
  • La apelarea funcției de anulare (cancel()), toate goroutine-urile primesc semnalul și se pot încheia corect.

Exemplu:

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 oprită\n", id)
                return
            default:
                // lucru în goroutine
                time.Sleep(100 * time.Millisecond)
            }
        }
    }(i)
}

// După un timp, oprim toate goroutine-urile
time.Sleep(1 * time.Second)
cancel()

// Așteptăm să se încheie (de exemplu, cu sync.WaitGroup)

Această abordare permite gestionarea centralizată a opririi mai multor goroutine-uri și evită problemele cu terminarea necontrolată.