PHpullh
학습 라이브러리/Go/워커 풀 패턴

GO · 고루틴/채널

워커 풀 패턴

고정 수의 워커 고루틴이 작업 채널에서 태스크를 가져가 처리합니다. 동시성 제한에 핵심적인 패턴입니다.

고루틴/채널고급worker-poolchannelgoroutineconcurrency

핵심 설명

고정 수의 워커 고루틴이 작업 채널에서 태스크를 가져가 처리합니다. 동시성 제한에 핵심적인 패턴입니다.

Go code

package main

import (
	"fmt"
	"sync"
)

func workerPool(numWorkers int, jobs <-chan int) <-chan int {
	results := make(chan int, len(jobs))
	var wg sync.WaitGroup

	for w := 0; w < numWorkers; w++ {
		wg.Add(1)
		go func(id int) {
			defer wg.Done()
			for job := range jobs {
				result := job * job // 작업 처리
				fmt.Printf("워커%d: %d → %d\n", id, job, result)
				results <- result
			}
		}(w)
	}

	go func() {
		wg.Wait()
		close(results)
	}()

	return results
}

func main() {
	jobs := make(chan int, 10)
	for i := 1; i <= 10; i++ {
		jobs <- i
	}
	close(jobs)

	results := workerPool(3, jobs)

	var total int
	for r := range results {
		total += r
	}
	fmt.Println("합계:", total)
}

학습 팁

워커 수를 runtime.NumCPU()로 설정하면 CPU 바운드 작업에 최적입니다. I/O 바운드는 더 많은 워커가 효과적입니다.

주의할 점

jobs 채널을 닫지 않으면 워커들이 영원히 range에서 대기합니다. 모든 작업 전송 후 반드시 close(jobs)를 호출하세요.

자주 묻는 질문

워커 풀 패턴란 무엇인가요?

고정 수의 워커 고루틴이 작업 채널에서 태스크를 가져가 처리합니다. 동시성 제한에 핵심적인 패턴입니다.

워커 풀 패턴 학습 시 주의할 점은 무엇인가요?

jobs 채널을 닫지 않으면 워커들이 영원히 range 에서 대기합니다. 모든 작업 전송 후 반드시 close(jobs) 를 호출하세요.