본문 바로가기
Study/Go

[Go] 고루틴(GoRoutine) 심화(3) - sync.Pool

by _royJang 2022. 5. 13.

Pool

Go는 GC(Garbage Collector)가 존재하는 언어이다. 그렇기에 사용하지 않는 객체는 GC가 이를 알아차려 정리하고자 할 것이다. 그러나 객체를 생성하는데 굉장히 오랜시간이 걸리고 당장엔 사용하지 않지만 이를 재사용할 가능성이 높다면 GC가 삭제하는 것은 큰 효율성 저하를 불러올 것이다. 또한 많은 객체를 생성해야 할 필요가 있는 객체역시 만들어 놓은것을 재사용한다면 메모리적으로도 크게 이득을 볼 수 있을 것이다.

이를 효율적으로 관리해 주는 것이 Pool이라 불리는 객체 저장소이다.
그리고 Go 언어는 이 기능을 Sync 패키지에 내장해 두었고 이것이 sync.Pool 이다.

Sync.Pool의 기본 기능

GET

풀에 저장된 인스턴스를 불러오는 함수.

NEW

풀에 저장된 인스턴스가 없다면 풀에 정의된 New 함수를 호출하여 인스턴스를 생성.

PUT

사용을 마친 인스턴스를 풀에 다시 넣음. 사용가능 인스턴스 수를 +1 시킴.

예제 코드

package main

import (
    "fmt"
    "sync"
)

func main() {
    myPool := &sync.Pool{
        New: func() interface{} {
            fmt.Println("Create new instance.")
            return struct{}{}
        },
    }

    myPool.Get()
    instance := myPool.Get()
    myPool.Put(instance)
    myPool.Get()

}

결과 값

Create new instance.
Create new instance.

예제 코드 설명

myPool이라는 Pool 객체를 생성해 준 모습이다.
이 myPool 객체에서 Get 함수를 통해 저장된 인스턴스를 가져다 쓰고자 하지만 저장된 값은 없다. 그렇기에 Pool에 정의된 New함수를 통해 객체를 생성한 후 그값을 사용한다.
그리고 Put을 사용해 생성한 객체를 다시 반환시키고 다시 Get을 사용하면 사용할 수 있는 객체가 하나 있는 것이기에 New 함수가 실행되지 않는다.
그렇기에 사용할 객체가 없을 때의 Get 함수의 실행 횟수인 두번 New가 실행된 모습을 볼 수 있다.