Sobes.tech
Junior — Middle

Hogyan valósul meg a kommunikáció egy pufferelt csatornán keresztül, és hogyan történik az adatátvitel?

sobes.tech MI

Válasz az MI-től

Go-ban egy pufferelt csatorna akkor jön létre, ha megadjuk a méretét, például: ch := make(chan int, 3). Ez a csatorna akár 3 elemet is tárolhat anélkül, hogy blokkolná a küldőt.

A pufferelt csatornán keresztül történő adatátvitel során:

  • A küldő (chan <- value) a értéket a csatorna pufferméretébe helyezi. Ha a puffer nem tele van, az művelet nem blokkolódik.
  • Ha a puffer tele van, a küldő addig blokkol, amíg hely nem szabadul.
  • A fogadó (value := <- chan) kivonja az értéket a pufferről. Ha a puffer üres, a fogadó blokkolódik, amíg adatok nem érkeznek.

Példa:

ch := make(chan int, 2)

ch <- 1 // nem blokkol, 1 elem van a pufferen
ch <- 2 // nem blokkol, 2 elem van a pufferen (tele a puffer)

fmt.Println(<-ch) // kiírja 1-et, felszabadít helyet a pufferen
ch <- 3 // most már küldhető, van hely

Így a pufferelt csatornák lehetővé teszik az adatok ideiglenes tárolását és csökkentik a blokkolásokat a goroutine-ok között.