0Pricing
Go Academy · 강의

팬인과 팬아웃 패턴

여러 채널을 병합하고 작업을 분배합니다.

팬인과 팬아웃 패턴은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. select 문
  2. 타임아웃과 틱커
  3. 팬인과 팬아웃 패턴
  4. 워커 풀 패턴
← Go Academy(으)로 돌아가기