Sobes.tech
Junior — Middle

Ce se întâmplă primul: procesarea semnalului de anulare sau finalizarea înregistrării, dacă acestea au loc simultan în canal?

sobes.tech AI

Răspuns de la AI

În Go, atunci când încerci simultan să trimiți un semnal de anulare (de exemplu, prin închiderea unui canal sau trimiterea unei valori) și să finalizezi scrierea într-un canal, ordinea de procesare nu este garantată și depinde de planificatorul goroutine-urilor și de starea canalelor. Canalele în Go sincronizează operațiile, dar dacă două operații au loc simultan, una dintre ele va fi executată prima, dar acest lucru nu este definit de specificație.

Adică, dacă o goroutine încearcă să scrie într-un canal, iar o altă goroutine închide același canal sau trimite un semnal de anulare în același timp, nu se poate determina care operație va fi procesată prima. Este important să proiectezi logica astfel încât să nu te bazezi pe ordinea acestor evenimente simultane.

Exemplu:

cancel := make(chan struct{})
date := make(chan int)

// Goroutine care ascultă cancel
go func() {
    select {
    case <-cancel:
        fmt.Println("Anulare primită")
    case v := <-date:
        fmt.Println("Valoare primită", v)
    }
}()

// Trimitere simultană
close(cancel) // semnal de anulare
// sau
// date <- 42 // scriere în canal

În acest exemplu, care ramură va fi executată prima depinde de planificator.