PHpullh

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 )하지 않으면 이전 데이터가 남아 버그가 발생합니다.

Continue Learning

Go 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.