sync.Pool对象池

sync.Pool

  pool就是对象缓存池,用来减少堆上内存的反复申请和释放的。因为 golang 的内存是用户触发申请,runtime 负责回收。如果用户申请内存过于频繁,会导致runtime 的回收压力陡增,从而影响整体性能。
	有了pool 之后就不一样了,对象申请先看池子里有没有现成的,有就直接返回。释放的时候内存也不是直接归还,而是放进池子而已。适时释放。
	这样就能极大的减少申请内存的频率。从而减少gc压力

示例代码:

// 1.初始化sync.Pool对象池,new函数就是创建Person结构体
func initPool() *sync.Pool {
	return &sync.Pool{
		New: func() interface{} {
			fmt.Println("创建一个 person.")
			return &Person{}
		},
	}
}

type Person struct {
	Name string
	Age int
}


// 主函数,入口函数
func main() {
	pool := initPool() //获取对象池
	person := pool.Get().(*Person) //获取对象池中一个对象,此时刚初始化,是空对象
	fmt.Println("首次从sync.Pool中获取person:", person) //&{ 0}
  
	person.Name = "Jeff"
	person.Age = 18
	pool.Put(person) //只放入一个对象到对象池中

	fmt.Println("设置的对象Name: ", person.Name) //Jeff
	fmt.Println("设置的对象Age: ", person.Age)   //18
  
  obj1:=pool.Get().(*Person)//从对象池中获取一个对象
  fmt.Println(obj1.Name) //Jeff
	fmt.Println(obj1.Age)  //18
  
  //从对象池中再次获取一个对象,此时没有了。因为对象池中只放入了一个对象
  obj2:=pool.Get().(*Person)
	fmt.Println(obj2.Name) //空
	fmt.Println(obj2.Age)  //0
}

总结

pool.Get().(*Person) //获取对象,*Person为对象类型
pool.Put(person) //放入一个对象到对象池

//初始化对象池1
func initPool() *sync.Pool {
	return &sync.Pool{
		New: func() interface{} {
			fmt.Println("创建一个 person.")
			return &Person{}
		},
	}
}

//初始化对象池2
var objPool = sync.Pool{
	New: func() interface{} {
		return &Person{}
	},
}

md5

package pkg

import (
	"crypto/md5"
	"encoding/hex"
)

var md5Pool = sync.Pool{
	New: func() interface{} {
		return md5.New()
	},
}

func MD5(str string) string {
	h := md5.New()
        //使用对象池
        //h := md5Pool.Get().(hash.Hash)
	str = str + "加盐加盐"
	h.Write([]byte(str)) // 需要加密的字符串为 123456
	cipherStr := h.Sum(nil)
	return hex.EncodeToString(cipherStr) // 输出加密结

}
posted @ 2022-05-16 11:54  Jeff的技术栈  阅读(107)  评论(0编辑  收藏  举报
回顶部