Junior — Middle
Kuo skiriasi kanalas su buferiu nuo kanalo be buferio goroutines tarpusavio sąveikos kontekste?
sobes.tech AI
Atsakymas iš AI
Kanalas be buferio (unbuffered channel) blokuoja siuntėją, kol gavėjas perskaitys reikšmę, ir atvirkščiai — gavėjas blokuojasi, kol neatsiras reikšmė. Tai užtikrina sinchronizaciją tarp gorutinų.
Kanalas su buferiu (buffered channel) turi vidinį fiksuoto dydžio buferį. Siuntėjas gali siųsti kelias reikšmes iš eilės be blokuojantis, kol buferis neužpildytas. Gavėjas gali skaityti reikšmes iš buferio be laukimo siuntėjo, jei buferis nėra tuščias.
Pavyzdys:
ch := make(chan int) // be buferio
chBuf := make(chan int, 2) // su 2 elementų buferiu
// ch <- 1 // užblokuos, jei nėra gavėjo
chBuf <- 1 // nebus blokuojama, kol buferis neužpildytas
Taip, buferiuoti kanalai leidžia lankstesnį sinchronizacijos valdymą ir gali pagerinti našumą, sumažindami blokuojimų skaičių.