Go'da kanal, gorontinler arasında veri iletimi ve senkronizasyon için bir araçtır. İki tür kanal vardır:
Tamponlu olmayan kanallar, senkronizasyonun kritik olduğu ve gönderici ile alıcının kodda bir yerde buluşmasını garanti etmenin gerektiği durumlarda kullanışlıdır. Tamponlu kanallar ise "fazla veri" iletimi için - kuyruklar, işçiler ve asenkron görevler düzenlemek için uygundur.
func main() { ch := make(chan int) // tamponlu olmayan go func() { ch <- 42 // alıcı yoksa engellenir }() fmt.Println(<-ch) bufch := make(chan int, 2) // 2 elemanlı tamponlu bufch <- 1 // engellenmez bufch <- 2 // engellenmez // sonraki gönderim, okumazsa engellenecektir }
Tamponlu bir kanal, ek senkronizasyon olmaksızın onlarca üretici ve tüketici arasında bir kuyruk olarak kullanılabilir mi?
Çoğu zaman "evet" denir. Gerçekte, yalnızca sıralama garantisi önemli değilse ve mesajlar kaybolmuyorsa. Birkaç okuyucu/yazıcı olduğunda yarış koşulları ve veri kayıpları oluşabilir, bu nedenle senkronizasyon kontrolü yine de gereklidir (işçi havuzu, mutexler, kanalların kapatılması için bağlamlar).
Hikaye
Log işleme sürecinde programcılar, bir parser ile bir toplayıcı arasında olayları iletmek için 1000 uzunluğunda bir tamponlu kanal kullandılar. Servisin durdurulmasında kanalı kapatmayı unuttular ve bazı olaylar "kayboldu" - işçiler tüm tampon işlenmeden önce sona erdiler. Sorun, kanalların açıkça kapatılması ve tam boşaltma için engellemeler ile düzeltildi.
Hikaye
Dağıtık bir hizmette mutex kuyruğunu tamponlu bir kanal ile değiştirme girişiminde "asılı" göndericileri göz önünde bulundurmadılar: tampon tamamen dolduğunda gönderme engeli, tüm sistemi yavaşlattı, zaman aşımlarına yol açtı ve arayüz "lag" yapmaya başladı. Analizden sonra, bazı senkronizasyonları condition variables ile geri getirdiler.
Hikaye
Gözlem modülünde, bir modül ile tüketici arasında hata günlüğü için tamponlu olmayan bir kanal kullanıldı. Tesadüfi işleme gecikmesi nedeniyle yazar engellendi ve bir dakikada yüz binlerce veri gorontinlerinde birikti — "gorontin kalmadı" hatası oluştu. Sorun, tamponlu olmayan kanalı tamponlu olanla ve kuyruğu temizlemek için asenkron bir işçi ile değiştirerek düzeltildi.