PHpullh
학습 라이브러리/Go/팬아웃/팬인 패턴

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).

팬아웃/팬인 패턴 학습 시 주의할 점은 무엇인가요?

팬인에서 모든 입력 채널이 닫혀야 출력 채널도 닫힙니다. 하나라도 닫히지 않으면 고루틴 누수가 발생합니다.