Čo sa stane ako prvé: spracovanie signálu zrušenia alebo ukončenie nahrávania, ak k nim dôjde súčasne v kanáli?
sobes.tech AI
Odpoveď od AI
V jazyku Go, keď sa pokúsite súčasne odoslať signál zrušenia (napríklad zatvorením kanála alebo odoslaním hodnoty) a dokončiť zápis do kanála, poradie spracovania nie je garantované a závisí od plánovača gorútin a stavu kanálov. Kanály v Go synchronizujú operácie, ale ak dve operácie nastanú súčasne, jedna z nich bude vykonaná prvá, ale to nie je definované špecifikáciou.
To znamená, že ak gorutina sa pokúša zapisovať do kanála, a iná gorutina tento kanál súčasne zatvorí alebo odošle signál zrušenia, nie je možné určiť, ktorá operácia bude spracovaná prvá. Je dôležité navrhnúť logiku tak, aby ste sa na poradie takýchto súčasných udalostí nespoliehali.
Príklad:
cancel := make(chan struct{})
data := make(chan int)
// Gorutina, ktorá počúva cancel
go func() {
select {
case <-cancel:
fmt.Println("Zrušenie prijaté")
case v := <-data:
fmt.Println("Prijatá hodnota", v)
}
}()
// Súčasné odoslanie
close(cancel) // signál zrušenia
// alebo
// data <- 42 // zápis do kanála
V tomto príklade záleží od plánovača, ktorá vetva bude vykonaná prvá.