რა მოხდება პირველ რიგში: გაუქმების სიგნალის დამუშავება თუ ჩაწერის დასრულება, თუ ისინი ერთდროულად ხდება არხში?
sobes.tech AI
პასუხი AI-სგან
Go dilində, eyni zamanda ləğv siqnalı göndərməyə çalışarkən (məsələn, kanalı bağlamaq və ya dəyər göndərmək) və kanal üzərinə yazmağı tamamlayarkən, emal sırası təmin edilmir və bu, goroutine planlayıcısına və kanalların vəziyyətinə bağlıdır. Kanallar Go-da əməliyyatları sinxronizasiya edir, lakin iki əməliyyat eyni vaxtda baş verərsə, biri ilk olaraq icra olunacaq, amma bu, spesifikasiya ilə müəyyən edilmir.
Yəni, əgər goroutine kanala yazmağa çalışırsa və başqa goroutine eyni zamanda bu kanalı bağlayırsa və ya ləğv siqnalı göndərirsə, hansı əməliyyatın əvvəl işlənəcəyini müəyyən etmək mümkün deyil. Belə hadisələrin ardıcıllığına əsaslanmamaq üçün logikanı düzgün qurmaq vacibdir.
Nümunə:
cancel := make(chan struct{})
data := make(chan int)
// Cancel-u dinləyən goroutine
go func() {
select {
case <-cancel:
fmt.Println("Ləğv alındı")
case v := <-data:
fmt.Println("Qəbul edilən dəyər", v)
}
}()
// Eyni vaxtda göndəriş
close(cancel) // ləğv siqnalı
// və ya
// data <- 42 // kanala yazma
Bu nümunədə, hansı qolun ilk işləyəcəyi planlayıcıdan asılıdır.