GO · 고루틴/채널
sync.Pool
sync.Pool로 임시 객체를 재사용하여 GC 압력을 줄입니다. 빈번한 할당/해제가 있는 곳에 효과적입니다.
고루틴/채널고급sync-poolobject-reusegcperformance
핵심 설명
sync.Pool로 임시 객체를 재사용하여 GC 압력을 줄입니다. 빈번한 할당/해제가 있는 곳에 효과적입니다.
Go code
package main
import (
"bytes"
"fmt"
"sync"
)
var bufPool = sync.Pool{
New: func() any {
return new(bytes.Buffer)
},
}
func process(data string) string {
buf := bufPool.Get().(*bytes.Buffer)
defer func() {
buf.Reset() // 반드시 초기화 후 반환
bufPool.Put(buf)
}()
buf.WriteString("[처리됨] ")
buf.WriteString(data)
return buf.String()
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
result := process(fmt.Sprintf("데이터-%d", id))
fmt.Println(result)
}(i)
}
wg.Wait()
}학습 팁
sync.Pool의 객체는 GC 시 정리될 수 있습니다. 영구 캐시가 아닌 임시 버퍼 재사용에 적합합니다.
주의할 점
Pool에 반환 전 객체를 초기화(Reset)하지 않으면 이전 데이터가 남아 버그가 발생합니다.
자주 묻는 질문
sync.Pool란 무엇인가요?
sync.Pool 로 임시 객체를 재사용하여 GC 압력을 줄입니다. 빈번한 할당/해제가 있는 곳에 효과적입니다.
sync.Pool 학습 시 주의할 점은 무엇인가요?
Pool에 반환 전 객체를 초기화( Reset )하지 않으면 이전 데이터가 남아 버그가 발생합니다.