sync.Pool은 스레드 안전한 개체 풀로, 임시 개체를 재사용하여 메모리 사용량과 가비지 수집 오버헤드를 줄입니다.
여러 개의 로컬 풀을 프로세서 컨텍스트와 연관하여 유지하는데, 이러한 풀은 실행 중인 고루틴에 대한 개체 검색을 최적화합니다.
풀에서 개체를 요청할 때, 먼저 해당 프로세서의 로컬 풀에서 개체를 확인합니다. 찾으면 개체를 재사용하고, 그렇지 않으면 새로운 개체를 생성하여 로컬 풀에 추가합니다.
풀에 개체를 반환할 때, 즉시 재사용되지 않을 수 있고 언제든지 제거될 수 있습니다.
New() 함수를 사용하여 풀 이 비어 있을 때 새로운 개체를 생성할 수 있습니다. 제공되지 않으면 풀은 비어 있을 때 nil을 반환합니다.
풀에서 개체를 가져올 때는 풀.Get()을 사용하고, 풀에 개체를 반환할 때는 풀.Put()을 사용합니다.
개체를 풀에서 검색할 때 형식 추론을 피하기 위해 전용 함수를 사용하거나 sync.Pool의 일반 버전을 생성할 수 있습니다.
풀에 개체 포인터를 저장하면 불필요한 힙 할당을 방지하고 이스케이프 분석을 개선합니다.
PMG 스케줄링은 각 프로세서가 한 번에 하나의 고루틴만 실행할 수 있도록 하여, 해당 프로세서에서 실행 중인 고루틴에 대한 풀 액세스를 최적화합니다.
sync.Pool은 Go 표준 라이브러리에서 널리 사용되며, 예를 들어 encoding/json 및 net/http에서 I/O 작업을 최적화하고 임시 개체를 재사용하는 데 사용됩니다.
dev.to
Go sync.Pool and the Mechanics Behind It
