Junior — Middle
V čem se liší kanál s bufferem od kanálu bez bufferu v kontextu interakce mezi gorutinami?
sobes.tech AI
Odpověď od AI
Unbuffered kanál (kanál bez vyrovnávacej pamäte) blokuje odosielateľa, kým príjemca ne prečíta hodnotu, a naopak — príjemca je blokovaný, kým sa neobjaví hodnota. To zabezpečuje synchronizáciu medzi gorutinami.
Buffered kanál (kanál s vyrovnávacou pamäťou) má vnútornú pamäť pevnej veľkosti. Odosielateľ môže poslať niekoľko hodnôt za sebou bez blokovania, kým sa pamäť nezaplní. Príjemca môže čítať hodnoty z pamäti bez čakania na odosielateľa, ak pamäť nie je prázdna.
Príklad:
ch := make(chan int) // bez vyrovnávacej pamäte
chBuf := make(chan int, 2) // s vyrovnávacou pamäťou na 2 prvky
// ch <- 1 // zablokuje sa, ak nie je príjemca
chBuf <- 1 // nezablokuje sa, kým sa pamäť nezaplní
Týmto spôsobom umožňujú vyrovnávacie kanály flexibilnejšie riadenie synchronizácie a môžu zvýšiť výkon znížením počtu blokovaní.