Sobes.tech
Senior
49

Сіз fan-in/fan-out және pipeline үлгілеріне таныссыз ба? Олар не?

Сұралған компаниялар
техвил

AI-дан жауап

sobes.tech AI

Fan-in/fan-out және pipeline паттерндары Go тілінде деректерді параллель және конвейерлік өңдеуге жиі қолданылады.

  • Fan-out — бұл бір деректер көзінен бірнеше горутинге тарату, мысалы, бірнеше жұмысшы бір каналдан оқиды.

  • Fan-in — керісінше процесс, бірнеше горутиннің нәтижелерін бір каналға жинау, деректер ағынын біріктіру.

  • Pipeline — өңдеу кезеңдерінің тізбегі, мұнда бір кезеңнің шығуы келесі кезеңнің кірісіне беріледі, каналдар арқылы. Бұл жауапкершілікті бөлу және параллелизммен өңдеу тізбектерін құруға мүмкіндік береді.

Fan-out және fan-in бар қарапайым pipeline мысалы:

func generator(nums ...int) <-chan int {
    out := make(chan int)
    go func() {
        defer close(out)
        for _, n := range nums {
            out <- n
        }
    }()
    return out
}

func worker(in <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        defer close(out)
        for n := range in {
            out <- n * n // мысалы, квадраттау
        }
    }()
    return out
}

func fanIn(channels ...<-chan int) <-chan int {
    var wg sync.WaitGroup
    out := make(chan int)
    output := func(c <-chan int) {
        defer wg.Done()
        for n := range c {
            out <- n
        }
    }
    wg.Add(len(channels))
    for _, c := range channels {
        go output(c)
    }
    go func() {
        wg.Wait()
        close(out)
    }()
    return out
}

func main() {
    nums := generator(1, 2, 3, 4, 5)

    // Fan-out: бірнеше жұмысшыны іске қосу
    w1 := worker(nums)
    w2 := worker(nums)

    // Fan-in: нәтижелерді біріктіру
    for n := range fanIn(w1, w2) {
        fmt.Println(n)
    }
}

Осы паттерндер тиімді параллелизмді пайдаланып, масштабталатын өңдеу конвейерлерін құруға көмектеседі.