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