Golang sync.Pool

在撰寫 web 時, 都會需要使用一個 struct 去接收 request 所以都會 allocat, 一般流量不大時還好, 一旦流量大會使系統資源的開銷大增 這時候就會需要 memory reuse, 而 golang 已經為我們準備好 sync.Pool 的工具

Example

主要在 Get 的時候

package main

import (
    "fmt"
    "sync"
)

type Request struct{
    Data string
}

type RequestPool struct{
    pool sync.Pool
}

func NewRequestPool() *RequestPool{
    return &RequestPool{
        pool: sync.Pool{
            New: func() interface{}{
                return new(Request)
            },
        },
    }
}
func (p *RequestPool) Get() *Request{
    // 當拿不到時, 會去 New 一個物件出來
    r := p.pool.Get().(*Request)
    // 這裡要做歸零動作 clean
    r.Data = ""
    return r
}

func (p *RequestPool) Put(r *Request) {
    p.pool.Put(r)
}

func main() {
    rp := NewRequestPool()
    for i:=0; i<100; i++{
        r := rp.Get()
        fmt.Println(&r.Data)
        rp.Put(r)
    }
}

https://play.golang.org/p/TpdBVgN2GeF