Sobes.tech
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í.