Sobes.tech
Junior — Middle

Cum poți opri execuția unei goroutine dacă valoarea așteptată nu a fost încă atinsă?

sobes.tech AI

Răspuns de la AI

În Go, pentru a opri o gorutină care așteaptă o valoare, dar această valoare poate să nu sosească, se folosesc de obicei canale cu timeout sau context cu anulare.

Exemplu cu timeout folosind select și time.After:

select {
case val := <-ch:
    // valoarea a fost primită, continuă munca
case <-time.After(time.Second * 5):
    // timeout, oprește gorutina
}

Alt mod este să folosești un context (context.Context), care poate fi anulat din exterior:

ctx, cancel := context.WithCancel(context.Background())

go func() {
    select {
    case val := <-ch:
        // procesează val
    case <-ctx.Done():
        // oprește gorutina
    }
}()

// undeva în cod, apelează cancel() pentru a opri gorutina

Astfel, gorutina nu va aștepta la nesfârșit și se poate termina în mod corect.