Sobes.tech
Junior — Middle

V čom sa líši kanál s vyrovnávacou pamäťou od kanála bez nej v kontexte interakcie medzi gorutinami?

sobes.tech AI

Odpoveď od AI

Kanál bez vyrovnávacej pamäte (unbuffered channel) 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.

Kanál s vyrovnávacou pamäťou (bufferovaný kanál) 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äti
chBuf := make(chan int, 2)  // s vyrovnávacou pamäťou na 2 prvky

// ch <- 1  // zablokuje sa, ak nie je príjemca
chBuf <- 1 // nebude sa blokovať, 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í.