由浅入深聊聊Golang的sync.Pool

2024-06-20 20:38

本文主要是介绍由浅入深聊聊Golang的sync.Pool,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

今天在思考优化GC的套路,看到了sync.Pool,那就来总结下,希望可以有个了断。

用最通俗的话,讲明白知识。以下知识点10s后即将到来。

1.pool是什么?
2.为什么需要sync.Pool?
3.如何使用sync.Pool?
4.走一波源码
5.源码关键点解析

正文

1.sync.Pool是什么?

Golang在 1.3 版本的时候,在sync包中加入一个新特性:Pool。
简单的说:就是一个临时对象池

2.为什么需要sync.Pool?

保存和复用临时对象,减少内存分配,降低GC压力。

(对象越多GC越慢,因为Golang进行三色标记回收的时候,要标记的也越多,自然就慢了)

3.如何使用sync.Pool?

func main() {// 初始化一个poolpool := &sync.Pool{// 默认的返回值设置,不写这个参数,默认是nilNew: func() interface{} {return 0},}// 看一下初始的值,这里是返回0,如果不设置New函数,默认返回nilinit := pool.Get()fmt.Println(init)// 设置一个参数1pool.Put(1)// 获取查看结果num := pool.Get()fmt.Println(num)// 再次获取,会发现,已经是空的了,只能返回默认的值。num = pool.Get()fmt.Println(num)
}

使用较为简单。
总的思路就是:搞一个池子,预先放入临时产生的对象,然后取出使用

可能有同学问了,这个玩意儿官方出的,那他自己有在用吗?
答案是有的,其实你也一直在用。

就是fmt包啦,由于fmt总是需要很多[]byte对象,索性就直接建了一个[]byte对象的池子,来走一波代码。

type buffer []byte
// printer状态的结构体()
type pp struct {...
}// pp的对象池, 《====这里用到了。
var ppFree = sync.Pool{New: func() interface{} { return new(pp) },
}// 每次需要pp结构体的时候,都过sync.Pool进行获取。
func newPrinter() *pp {p := ppFree.Get().(*pp)p.panicking = falsep.erroring = falsep.fmt.init(&p.buf)return p
}

4.走一波源码

4.1 基础数据结构

type Pool struct {// noCopy,防止当前类型被copy,是一个有意思的字段,后文详说。noCopy noCopy// [P]poolLocal 数组指针local     unsafe.Pointer// 数组大小localSize uintptr        // 选填的自定义函数,缓冲池无数据的时候会调用,不设置默认返回nilNew func() 

这篇关于由浅入深聊聊Golang的sync.Pool的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079203

相关文章

基于 GoLang 编写的 IOT 物联网在线直播抓娃娃企业级项目

大家好,我是码农先森。 引言 前几年,娱乐物联网的热度很高。我当时所在的公司启动了一个将线下娃娃机的玩法,迁移到线上的项目,因此公司决定开发一个在线直播抓娃娃的项目。近来,娱乐物联网的领域已经进入资本的寒冬,很多相关的行业都已经濒临倒闭,我们之前的公司也不例外。目前公司大势已去,所以我将相关非关键的项目代码开源,仅供大家参考学习。 项目介绍 这是一个基于 GoLang 编写的 IOT

使用golang与智能合约进行交互

文章目录 使用golang与智能合约进行交互一、go-ethereum整体思路 二、使用ERC-20实操1. 编译和部署erc-20合约2. 获取合约abi文件 (准备好合约的abi文件 abi.json)使用hardcat生成的json文件中获取 3. 准备好solc和abigen工具4. 使用工具生成go代码5. go代码编写连接到区块链网络创建智能合约对象 6. 调用转账方法 三、参考

由浅入深,走进深度学习(4)

各位小伙伴大家好,这期内容是深度学习基础的一个进阶,也可以说是夯实一下很多细节内容 个人感受:动手敲一遍,带着思考,会有不一样的感受!!! 代码是比较多的,有很多内容我也是都在代码上面注释了~ 正片开始!!! 首先,机器学习用的最多的是N维数组,N维数组是机器学习和神经网络的主要数据结构 注: 创建数组需要 形状(3×4) 数据类型(浮点数32位) 元素值(随机数)访问元素 根

Golang | Leetcode Golang题解之第179题最大数

题目: 题解: func largestNumber(nums []int) string {sort.Slice(nums, func(i, j int) bool {x, y := nums[i], nums[j]sx, sy := 10, 10for sx <= x {sx *= 10}for sy <= y {sy *= 10}return sy*x+y > sx*y+x})if

聊聊你不知道的建造者设计模式

距离上次写博客的距离也快一个月了,最近打算跟大家分享一下建造者模式,其实这个模式以前也介绍过,当时只是介绍它在android项目中广泛被应用于创建对象的链式调用,并没有深入的去说明其中的逻辑性,由于这次跟王大哥讨论建造者模式,我还是决定写一篇博客记录一下自己对建造者模式的理解,各位可以提出不同的观点,相互交流 1:Builder 设计模式 1.1:为什么要用建造者模式1.2:建造者模式的几个

Golang笔记:使用serial包进行串口通讯

文章目录 目的使用入门总结 目的 串口是非常常用的一种电脑与设备交互的接口。这篇文章将介绍golang中相关功能的使用。 本文使用的包为 :go.bug.st/serial https://pkg.go.dev/go.bug.st/serial https://github.com/bugst/go-serial 另外还有一些常见的包如:tarm/serial https:/

聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例

前言 dynamic 是一种有别于传统变量类型的动态类型声明,刚开始接触可能在理解上会有些困难,可以简单地把它理解为一个盲盒,你可以任意猜测盒子有什么东西,并认为这些东西真正存在而进行处理,等到真正打开时,才能真正确定这些东西是不是真的存在。 所以,当使用 dynamic 声明一个变量时,编译器不会去检查该变量的成员或方法的有效性,换句话说,你可以调用任意成员或方法,即使它们不存在,编译器

Golang | Leetcode Golang题解之第172题阶乘后的零

题目: 题解: func trailingZeroes(n int) (ans int) {for n > 0 {n /= 5ans += n}return}

开发 Golang 项目的 Docker 化案例

开发 Golang 项目的 Docker 化案例 在这个案例中,我们将展示如何使用 Docker 容器化一个简单的 Golang Web 应用。我们将创建一个基于 Go 的 Hello World 应用,并使用 Docker 和 Docker Compose 管理容器化环境。 1. 创建 Golang Web 应用 首先,创建一个简单的 Golang Web 应用,用于展示一个简单的 Hel

Golang | Leetcode Golang题解之第173题二叉搜索树迭代器

题目: 题解: type BSTIterator struct {stack []*TreeNodecur *TreeNode}func Constructor(root *TreeNode) BSTIterator {return BSTIterator{cur: root}}func (it *BSTIterator) Next() int {for node := it.cu