Sobes.tech
Junior — Middle

Kokiais atvejais vyksta blokavimas dirbant su standartiniu duomenų perdavimo kanalu?

sobes.tech AI

Atsakymas iš AI

Go standartinis duomenų perdavimo kanalas blokuojamas šiais atvejais:

  • Siunčiant reikšmę į kanalą (chan <- value), jei kanalas neturi buferio arba buferis yra pilnas, siuntimo gorutina blokuojama iki tol, kol kitas srautas perskaitys reikšmę.
  • Skaitydama iš kanalo (value := <- chan), jei kanalas yra tuščias, skaitymo gorutina blokuojama iki kol pasirodys duomenys.

Taip, blokavimas įvyksta bandant siųsti duomenis į pilną kanalą arba skaityti iš tuščio kanalo, užtikrinant sinchronizaciją tarp gorutinų.

Pavyzdys:

ch := make(chan int) // be buferio kanalas

// Siuntimas blokuojamas, kol kas nors neskaitys
go func() {
    ch <- 42
}()

reikšmė := <-ch // skaitymas išjungia siuntimą
fmt.Println(reikšmė)