GO · 성능
고루틴 풀링
고루틴 생성/소멸 비용을 줄이는 풀링 패턴. 워커 풀로 고루틴 수를 제한합니다.
성능고급goroutine-poolworkerconcurrencyresource
핵심 설명
고루틴 생성/소멸 비용을 줄이는 풀링 패턴. 워커 풀로 고루틴 수를 제한합니다.
Go code
package main
import (
"fmt"
"sync"
)
type Pool struct {
tasks chan func()
wg sync.WaitGroup
}
func NewPool(workers int) *Pool {
p := &Pool{tasks: make(chan func(), workers*2)}
for i := 0; i < workers; i++ {
p.wg.Add(1)
go func() {
defer p.wg.Done()
for task := range p.tasks {
task()
}
}()
}
return p
}
func (p *Pool) Submit(task func()) {
p.tasks <- task
}
func (p *Pool) Close() {
close(p.tasks)
p.wg.Wait()
}
func main() {
pool := NewPool(4) // 4개 워커
var mu sync.Mutex
results := make([]int, 0, 100)
for i := 0; i < 100; i++ {
n := i
pool.Submit(func() {
result := n * n
mu.Lock()
results = append(results, result)
mu.Unlock()
})
}
pool.Close()
fmt.Printf("처리 완료: %d건\n", len(results))
}학습 팁
Go의 고루틴은 매우 가볍지만(2-8KB 스택), 수십만 개가 동시에 실행되면 스케줄링 오버헤드가 커집니다. 풀링으로 제한하세요.
주의할 점
풀을 닫기 전에 모든 작업이 제출되었는지 확인하세요. Close 후 Submit하면 패닉이 발생합니다.
자주 묻는 질문
고루틴 풀링란 무엇인가요?
고루틴 생성/소멸 비용을 줄이는 풀링 패턴. 워커 풀로 고루틴 수를 제한합니다.
고루틴 풀링 학습 시 주의할 점은 무엇인가요?
풀을 닫기 전에 모든 작업이 제출되었는지 확인하세요. Close 후 Submit 하면 패닉이 발생합니다.