Fork me on GitHub

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://vearne.cc

前言

Golang常常被用在对性能有较高需求的场景。为了避免高频的创建对象和GC我们,需要使用对象池,可以使用它默认提供的sync.pool。
但是每次gc时,sync.pool中的cache的对象都会被释放,如果我们对性能的要求更高,且需求更加明确,我们可以使用自定义的对象池

实现

下面对象池的简易实现,大家可以参考

package main

import (
    "fmt"
)

type Car struct {
    name string
    age  int
}

type CarPool struct {
    Cached chan *Car
    Size   int
}

func NewCarPool(size int) *CarPool {
    x := CarPool{}
    x.Cached = make(chan *Car, size)
    x.Size = size
    return &x
}

func (c *CarPool) Get() *Car {
    var res *Car
    select {
    case res = <-c.Cached:
        fmt.Println("---get--")
    default:
        fmt.Println("---create one--")
        res = &Car{}
    }

    return res
}

func (p *CarPool) Put(c *Car) {
    select {
    case p.Cached <- c:
        fmt.Println("---put--")
    default:
        c = nil
        fmt.Println("---destroy--")
    }
}

func main() {
    carPool := NewCarPool(3)
    for i := 0; i < 5; i++ {
        x := carPool.Get()
        carPool.Put(x)
    }
}

参考资料:
1.广发证券Go在证券行情系统中的应用


请我喝瓶饮料

微信支付码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据