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)
}
}
Осы паттерндер тиімді параллелизмді пайдаланып, масштабталатын өңдеу конвейерлерін құруға көмектеседі.