Junior — Middle
Tudna példát mondani olyan szcenárióra, ahol pufferelt csatornát használnak adatátvitelhez?
sobes.tech MI
Válasz az MI-től
A Go-ban a pufferelt csatorna akkor használatos, amikor adatokat kell átadni goroutine-ok között, de nem akarjuk azonnal blokkolni a küldőt, ha a fogadó még nem kész elfogadni az adatokat. Például, ha egy producer gyorsabban generál adatokat, mint ahogy a fogyasztó feldolgozza azokat, a pufferelt csatorna lehetővé teszi több elem összegyűjtését anélkül, hogy a producernek várnia kellene.
Példa:
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int, 3) // 3 elemű puffer
// Producer
go func() {
for i := 1; i <= 5; i++ {
fmt.Printf("Küldés: %d\n", i)
ch <- i // nem blokkol, amíg a puffer nem telik meg
}
close(ch)
}()
// Fogyasztó
time.Sleep(time.Second) // késleltetés szimulálása
for val := range ch {
fmt.Printf("Kaptam: %d\n", val)
time.Sleep(500 * time.Millisecond) // lassú feldolgozás
}
}
Ebben a példában a producer küldheti az első 3 értéket a pufferelt csatornára anélkül, hogy blokkolna, majd várni fog, amíg a fogyasztó felszabadít helyet.