GO · 고루틴/채널
팬아웃/팬인 패턴
하나의 채널에서 여러 고루틴으로 분배(Fan-Out)하고, 결과를 하나의 채널로 합칩니다(Fan-In).
고루틴/채널고급fan-outfan-inpipelineconcurrency
핵심 설명
하나의 채널에서 여러 고루틴으로 분배(Fan-Out)하고, 결과를 하나의 채널로 합칩니다(Fan-In).
Go code
package main
import (
"fmt"
"sync"
)
// Fan-Out: 여러 고루틴에 작업 분배
func fanOut(input <-chan int, workers int) []<-chan int {
channels := make([]<-chan int, workers)
for i := 0; i < workers; i++ {
ch := make(chan int)
channels[i] = ch
go func() {
defer close(ch)
for n := range input {
ch <- n * n
}
}()
}
return channels
}
// Fan-In: 여러 채널을 하나로 합침
func fanIn(channels ...<-chan int) <-chan int {
merged := make(chan int)
var wg sync.WaitGroup
for _, ch := range channels {
wg.Add(1)
go func(c <-chan int) {
defer wg.Done()
for v := range c { merged <- v }
}(ch)
}
go func() { wg.Wait(); close(merged) }()
return merged
}
func main() {
input := make(chan int, 5)
go func() {
for i := 1; i <= 10; i++ { input <- i }
close(input)
}()
outputs := fanOut(input, 3)
merged := fanIn(outputs...)
for result := range merged {
fmt.Println(result)
}
}학습 팁
팬아웃 수는 CPU 코어 수나 외부 API 병렬 제한에 맞추세요. 과도한 팬아웃은 리소스 경합을 유발합니다.
주의할 점
팬인에서 모든 입력 채널이 닫혀야 출력 채널도 닫힙니다. 하나라도 닫히지 않으면 고루틴 누수가 발생합니다.
자주 묻는 질문
팬아웃/팬인 패턴란 무엇인가요?
하나의 채널에서 여러 고루틴으로 분배(Fan-Out)하고, 결과를 하나의 채널로 합칩니다(Fan-In).
팬아웃/팬인 패턴 학습 시 주의할 점은 무엇인가요?
팬인에서 모든 입력 채널이 닫혀야 출력 채널도 닫힙니다. 하나라도 닫히지 않으면 고루틴 누수가 발생합니다.