팬인과 팬아웃 패턴
여러 채널을 병합하고 작업을 분배합니다.
팬인과 팬아웃 패턴은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
팬아웃이란 무엇입니까
팬아웃은 하나의 채널에서 여러 고루틴으로 작업을 분배하여 병렬 처리를 가능하게 합니다. 각 워커는 동일한 입력 채널에서 받습니다.
팬아웃 예시
N개의 워커를 시작하여 모두 공유 작업 채널에서 읽도록 합니다:
func fanOut(jobs <-chan Job, n int) {
for i := 0; i < n; i++ {
go func() {
for job := range jobs {
process(job)
}
}()
}
}팬인이란 무엇입니까
팬인은 여러 채널을 하나로 병합하므로 하나의 소비자가 여러 생산자의 결과를 읽을 수 있습니다.
고루틴을 사용한 팬인
각 입력 채널마다 고루틴을 하나씩 시작하고, 각 고루틴이 값을 공유 출력 채널로 전달하도록 합니다.
func fanIn(cs ...<-chan int) <-chan int {
out := make(chan int)
var wg sync.WaitGroup
for _, c := range cs {
wg.Add(1)
go func(ch <-chan int) {
defer wg.Done()
for v := range ch { out <- v }
}(c)
}
go func() { wg.Wait(); close(out) }()
return out
}select를 사용한 팬인
입력 채널 수가 정해져 있다면 채널마다 고루틴을 만드는 것보다 select 반복문이 더 간단합니다.
func merge(a, b <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for a != nil || b != nil {
select {
case v, ok := <-a: if !ok { a = nil } else { out <- v }
case v, ok := <-b: if !ok { b = nil } else { out <- v }
}
}
}()
return out
}파이프라인 단계
팬아웃과 팬인을 결합하면 파이프라인 단계를 만들 수 있습니다. 하나의 입력 채널, N개의 병렬 워커, 하나로 병합된 출력 채널로 구성됩니다.
func parallelStage(in <-chan Work, n int) <-chan Result {
outs := make([]<-chan Result, n)
for i := 0; i < n; i++ {
outs[i] = worker(in)
}
return fanIn(outs...)
}채널을 깔끔하게 닫기
송신자가 채널을 닫고, 수신자는 두 값을 받는 형식이나 범위 반복을 통해 채널이 닫혔음을 확인합니다. 수신자 쪽에서 채널을 닫지 마십시오.
for v := range in { // exits when in is closed
process(v)
}WaitGroup으로 조정하기
모든 팬아웃 워커가 끝난 시점을 확인하려면 sync.WaitGroup을 사용합니다. 그런 다음 출력 채널을 닫아 하위 소비자가 작업을 마칠 수 있게 합니다.
백프레셔
버스트를 흡수하려면 파이프라인 단계 사이에 버퍼가 있는 채널을 사용합니다. 생산자와 소비자 사이에 예상되는 지연 시간 차이를 기준으로 버퍼 크기를 정합니다.
out := make(chan Result, 100) // buffer absorbs bursts오류 전파
값과 오류를 모두 담는 구조체로 결과를 감싸면 패닉을 발생시키지 않고 데이터와 함께 오류도 파이프라인을 통해 전달할 수 있습니다.
type Result struct {
Value int
Err error
}컨텍스트 취소
파이프라인 단계 전체에 컨텍스트를 전달하고 각 단계에서 ctx.Done()을 확인하면 취소 시 전체 파이프라인을 중지할 수 있습니다.
case <-ctx.Done():
return ctx.Err()빠른 확인
팬인 패턴에서 병합된 출력 채널을 닫는 것은 무엇입니까?
복습: 팬인과 팬아웃
핵심 내용:
- 팬아웃: 여러 워커가 하나의 채널에서 읽습니다
- 팬인: 소스마다 하나의 고루틴을 두어 하나의 출력 채널로 병합합니다
- WaitGroup은 병합된 채널을 닫는 작업을 조정합니다
- 취소에는 컨텍스트를, 백프레셔에는 버퍼가 있는 채널을 사용합니다
자주 묻는 질문
“팬인과 팬아웃 패턴” 강의는 무료인가요?
네 — “팬인과 팬아웃 패턴” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“팬인과 팬아웃 패턴”에서 뭘 배우나요?
여러 채널을 병합하고 작업을 분배합니다. 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“팬인과 팬아웃 패턴” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.