0Pricing
Go Academy · 강의

워커 풀 패턴

고정 크기의 고루틴 워커 풀을 구축합니다.

워커 풀 패턴은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

워커 풀이란 무엇입니까

워커 풀은 작업을 공유 큐에서 처리하는 고정된 수의 고루틴을 미리 만듭니다. 이를 통해 동시성의 상한을 정하고, 고루틴을 무제한으로 생성하여 리소스가 고갈되는 것을 방지합니다.

기본 구현

작업 채널과 해당 채널에서 모두 읽는 N개의 고루틴을 만듭니다:

func workerPool(n int, jobs <-chan Job, results chan<- Result) {
    var wg sync.WaitGroup
    for i := 0; i < n; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for job := range jobs {
                results <- process(job)
            }
        }()
    }
    wg.Wait()
    close(results)
}

작업 보내기

모든 작업을 채널로 보낸 후 채널을 닫습니다. 워커는 모든 작업을 처리하고 채널이 닫히면 범위 반복문을 빠져나옵니다.

jobs := make(chan Job, 100)
for _, j := range allJobs {
    jobs <- j
}
close(jobs) // signals workers to stop after draining

결과 수집하기

작업을 보내는 동시에 결과를 읽습니다. 작업 제출과 결과 수집이 서로 교착 상태에 빠지지 않도록 풀을 고루틴에서 실행합니다.

results := make(chan Result, 100)
go workerPool(5, jobs, results)
for r := range results {
    collect(r)
}

풀 크기 조정하기

CPU 중심 작업에는 풀 크기를 runtime.NumCPU()로 설정합니다. 입출력 중심 작업에는 더 높은 배수(예: 10×)를 사용하면 대기 시간을 활용할 수 있습니다. 최적의 지점을 찾으려면 프로파일링을 수행합니다.

n := runtime.NumCPU()
if ioHeavy { n = runtime.NumCPU() * 10 }

컨텍스트 취소 추가하기

취소 시 워커가 일찍 중지하도록 워커에 컨텍스트를 전달합니다:

for {
    select {
    case job, ok := <-jobs:
        if !ok { return }
        results <- process(ctx, job)
    case <-ctx.Done():
        return
    }
}

세마포어 대안

고정된 고루틴 풀 대신 버퍼가 있는 채널을 세마포어로 사용하면 동시에 실행되는 고루틴 수를 제한하면서도 작업마다 하나의 고루틴을 생성할 수 있습니다.

sem := make(chan struct{}, 10)
for _, job := range jobs {
    sem <- struct{}{}
    go func(j Job) {
        defer func() { <-sem }()
        process(j)
    }(job)
}

오류 처리

결과 구조체를 사용하여 결과와 함께 오류를 반환합니다. 첫 번째 오류가 발생하면 컨텍스트를 취소하거나, 최종 보고서를 위해 모든 오류를 수집합니다.

type Result struct{ Val int; Err error }

동적 풀 크기 조정

적응형 풀에는 가중치가 적용된 리소스를 획득하고 해제하여 동적 동시성 제한을 지원하는 golang.org/x/sync/semaphore를 사용합니다.

워커 풀과 errgroup 비교

golang.org/x/sync/errgroup은 N개의 고루틴을 시작하고 첫 번째 오류를 수집하는 더 간단한 API를 제공합니다. 재사용 가능한 워커 집합을 계속 유지해야 한다면 풀을 사용합니다.

정상적인 종료

워커에게 신호를 보내려면 작업 채널을 닫습니다. WaitGroup 작업이 끝나면 결과를 닫습니다. 대기 중인 작업 제출은 모두 close(jobs)보다 먼저 이루어져야 합니다.

빠른 확인

워커 풀은 워커에게 처리를 중지하라는 신호를 어떻게 보냅니까?

복습: 워커 풀

핵심 내용:

  • 고정된 N개의 고루틴이 하나의 작업 채널에서 읽습니다
  • 워커에게 작업을 끝내라는 신호를 보내려면 작업 채널을 닫습니다
  • WaitGroup이 완료 상태를 추적하고, 작업이 끝나면 결과를 닫습니다
  • CPU 중심 작업: 풀 크기 ≈ NumCPU, 입출력 중심 작업: 더 크게 설정합니다

자주 묻는 질문

“워커 풀 패턴” 강의는 무료인가요?

네 — “워커 풀 패턴” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“워커 풀 패턴”에서 뭘 배우나요?

고정 크기의 고루틴 워커 풀을 구축합니다. 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Go Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“워커 풀 패턴” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

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