Sobes.tech
Junior — Middle

Cum se poate opri corect o goroutine în execuție, dacă este necesar ca aceasta să se încheie în funcție de un semnal extern sau o condiție, chiar dacă rezultatul nu a fost încă obținut?

sobes.tech AI

Răspuns de la AI

Pentru a opri corect o goroutine în execuție printr-un semnal extern sau condiție în Go, se utilizează de obicei contextul (context.Context) sau canale pentru a transmite semnalul de anulare.

Exemplu cu utilizarea contextului:

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            // S-a primit semnalul de anulare, încheiem goroutine
            return
        default:
            // Executăm munca
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go worker(ctx)

    // La un moment dat, apelăm cancel() pentru a opri goroutine
    cancel()
}

Această abordare permite goroutinei să verifice periodic dacă a fost trimis un semnal de oprire și să se încheie corect, chiar dacă rezultatul nu a fost încă obținut. În mod similar, se poate folosi un canal pentru transmiterea semnalului de oprire, dar context este o metodă mai idiomatică și convenabilă în Go.