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.