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) 를 호출하세요.