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