乐趣区

关于后端:Go-使用-syncPool-来减少-GC-压力

前言

sync.Pool 是长期对象池,存储的是长期对象,不能够用它来存储 socket 长连贯和数据库连接池等。

sync.Pool 实质是用来保留和复用长期对象,以缩小内存调配,升高 GC 压力,比方须要应用一个对象,就去 Pool 外面拿,如果拿不到就调配一份,这比起不停生成新的对象,用完了再期待 GC 回收要高效的多。

sync.Pool

sync.Pool 的应用很简略,看下示例代码:

package student

import ("sync")

type student struct {
    Name string
    Age  int
}

var studentPool = &sync.Pool{New: func() interface{} {return new(student)
    },
}

func New(name string, age int) *student {stu := studentPool.Get().(*student)
    stu.Name = name
    stu.Age = age
    return stu
}

func Release(stu *student) {
    stu.Name = ""
    stu.Age = 0
    studentPool.Put(stu)
}

当应用 student 对象时,只须要调用 New() 办法获取对象,获取之后应用 defer 函数进行开释即可。

stu := student.New("tom", 30)
defer student.Release(stu)

// 业务逻辑
...

对于 sync.Pool 外面的对象具体是什么时候真正开释,是由零碎决定的。

小结

  1. 肯定要留神存储的是长期对象!
  2. 肯定要留神 Get 后,要调用 Put

以上,心愿对你可能有所帮忙。

举荐浏览

  • Go – 应用 options 设计模式
  • Go – json.Unmarshal 遇到的小坑
  • Go – 两个在开发中需注意的小点
  • Go – time.RFC3339 工夫格式化
退出移动版