Go语言中的Pool

news/2024/2/24 6:31:04/文章来源:https://blog.csdn.net/u013533380/article/details/135607001

简介

Go语言中的pool是一个资源池,它可以存储一定数量的资源,这些资源可以被多个goroutine共享。Pool可以提高资源的利用率,减少资源的创建和销毁带来的开销。

原理

Pool的实现原理很简单,它使用一个队列来存储资源。当一个goroutine需要使用资源时,它可以从队列中获取一个资源。如果队列中没有资源,则pool会创建一个新的资源并将其添加到队列中。当一个goroutine使用完资源后,它可以将资源归还给pool。pool会将归还的资源重新放入队列中,以便其他goroutine使用。

sync.Pool的源码解析

type Pool struct {noNew       bool        // disable New functionmu          sync.Mutex  // protects following fieldsclosed      bool        // pool is closedstacks      []*stack    // stack of stackCachesstackCache  *stackCache // cache of unused stacksnew         func() interface{}
}type stack struct {n, cap intbuf    []interface{}
}type stackCache struct {n        intprev     *stackCache // linked listnext     *stackCacheelem     []*stack
}

sync.Pool的结构

  • Pool: Pool是sync.Pool的主要结构体,它包含了Pool的各种字段,包括:

    • noNew: 如果为true,则禁用New函数。
    • mu: 一个互斥锁,用于保护Pool的其他字段。
    • closed: 如果为true,则表示Pool已关闭。
    • stacks: 一个存储stackCache的切片。
    • stackCache: 一个stackCache类型的指针,用于缓存未使用的stack。
    • new: 一个函数,用于创建新的资源。
  • stack: stack是sync.Pool中用于存储资源的结构体,它包含了以下字段:

    • n: stack中已存储的资源数量。
    • cap: stack的容量。
    • buf: 一个存储资源的切片。
  • stackCache: stackCache是sync.Pool中用于缓存未使用的stack的结构体,它包含了以下字段:

    • n: stackCache中已缓存的stack数量。
    • prev: 指向前一个stackCache的指针。
    • next: 指向下一个stackCache的指针。
    • elem: 一个存储stack的切片。

sync.Pool的工作原理

sync.Pool的工作原理如下:

  • 当一个goroutine需要使用资源时,它可以调用sync.Pool的Get()方法来获取一个资源。
  • 如果sync.Pool的stackCache不为空,则sync.Pool会从stackCache中获取一个stack,并将stack中的资源返回给goroutine。
  • 如果sync.Pool的stackCache为空,则sync.Pool会创建一个新的stack,并将stack中的资源返回给goroutine。
  • 当一个goroutine使用完资源后,它可以调用sync.Pool的Put()方法来归还资源。
  • 如果sync.Pool的stackCache已满,则sync.Pool会将归还的资源放入stackCache中。
  • 如果sync.Pool的stackCache未满,则sync.Pool会将归还的资源放入stack中。

sync.Pool的并发安全性

sync.Pool是并发安全的,这意味着它可以被多个goroutine同时使用。sync.Pool使用互斥锁来保护其内部数据结构,以确保并发访问时数据的正确性。

sync.Pool的性能

sync.Pool的性能非常高,因为它可以避免资源的重复创建和销毁。sync.Pool还可以减少资源的创建和销毁带来的开销,从而提高程序的性能。

使用场景

Pool可以用于管理各种各样的资源,例如数据库连接、网络连接、文件句柄等。使用pool可以带来以下好处:

  • 提高资源的利用率。通过使用pool,可以避免资源的重复创建和销毁,从而提高资源的利用率。
  • 减少资源的创建和销毁带来的开销。创建和销毁资源往往需要消耗大量的时间和资源。使用pool可以减少资源的创建和销毁次数,从而减少资源的创建和销毁带来的开销。
  • 提高程序的性能。通过使用pool,可以提高程序的性能。这是因为pool可以避免资源的重复创建和销毁,从而减少程序的开销。

项目实战案例

在实际项目中,可以使用pool来管理数据库连接。例如,在一个web应用程序中,我们可以使用pool来管理与数据库的连接。当一个用户访问web应用程序时,应用程序会从pool中获取一个数据库连接,并在处理完用户的请求后将数据库连接归还给pool。这样,就可以避免每次处理一个用户的请求时都创建一个新的数据库连接,从而提高程序的性能。

package mainimport ("sync"
)type Resource struct {// ...
}func main() {// 创建一个sync.Pool对象pool := &sync.Pool{New: func() interface{} {// 创建一个新的资源return &Resource{}},}// 从pool中获取一个资源resource := pool.Get().(*Resource)// 使用资源// ...// 将资源归还给poolpool.Put(resource)
}

总结

sync.Pool是一个非常有用的工具,它可以提高资源的利用率,减少资源的创建和销毁带来的开销,提高程序的性能。sync.Pool的实现原理非常简单,它使用一个队列来存储资源。当一个goroutine需要使用资源时,它可以从队列中获取一个资源。如果队列中没有资源,则sync.Pool会创建一个新的资源并将其添加到队列中。当一个goroutine使用完资源后,它可以将资源归还给sync.Pool。sync.Pool会将归还的资源重新放入队列中,以便其他goroutine使用。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_925204.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB Compass当前版本及历史版本下载安装

mongoDB compass 当前版本下载 官网 https://www.mongodb.com/try/download/compass 官网下载一般只能下载最新版本。 github https://github.com/mongodb-js/compass MongoDB Compass与MongoDB的版本对应关系 MongoDB CompassMongoDB1.9.12MongoDB 2.6.11 Community

Redis:原理速成+项目实战——Redis企业级项目实战终结篇(HyperLogLog实现UV统计)

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:Redis:原理速成项目实战——Redis实战14(BitMap实现用户签到功能) 📚订阅专栏&am…

uniapp-uniCloud的基本使用(编写云存储的地区级联选择器)

目录 新建项目,创建 uniCloud 服务空间并关联 1. 新建项目 2. 创建 uniCloud 服务空间并关联 manifest.json内未配置Appld,请重新获取后再 云数据库的使用 城市选择和云数据库 介绍 云端数据 DB Schema概述 新建项目,创建 uniCloud 服务空间并关…

统计学-R语言-4.3

文章目录 前言直方图茎叶图箱线图练习 前言 本篇介绍的是数值型数据怎么进行数据可视化,本篇介绍的有直方图、茎叶图、箱线图。 直方图 直方图(Histogram)用于描述连续型变量的频数分布,实际应用中常用于考察变量的分布是否对称…

Java零基础——Vue基础篇

1.【熟悉】Vue简介 1.1 简介 它是一个构建用户界面单页面的框架 Vue是一个前端框架 https://www.pmdaniu.com/#file UI网站 UI 一般开发者使用蓝湖 工具 看着UI图 写接口 https://lanhuapp.com/web/#/item 是一个轻量级的MVVM(Model-View-ViewModel&#xff…

maven管理使用

maven基本使用 一、简介二、配置文件三、项目结构maven基本标签实践(例子) 四、pom插件配置五、热部署六、maven 外部手动加载jar打包方式Maven上传私服或者本地 一、简介 基于Ant 的构建工具,Ant 有的功能Maven 都有,额外添加了其他功能.本地仓库:计算机中一个文件夹,自己定义…

Linux实操学习

Linux常用操作 一、帮助命令1. man1.1 基本语法1.2 快捷键1.3 注意事项 2. help2.1 基本语法2.2 注意事项 3. 常用快捷键 二、文件目录类1. 常规操作1.1 pwd1.2 cd1.3 ls 2. 文件夹操作2.1 mkdir2.2 rmdir 3. 文件操作3.1 touch3.2 cp3.3 rm3.4 mv 4. 文件查看4.1 cat4.2 more4…

国内外好用的 LLM 列表

视频来源:https://www.bilibili.com/video/BV1c64y157Qm/?vd_source1e841703c91b5b77fd20e5707bae49d2 下图是测试括号闭合能力的得分

windows系统下docker软件中使用ubuntu发行版本的linux系统

1.软件下载 官网下载地址 下载安装之后,再去微软商店下载wsl软件,可以直接用,或者也可以使用命令行拉取(下面会讲) 2.在docker里面创建容器的两种方法 2.1.命令行创建 前言:输入 winr 打开命令行进行下面…

软件测试|使用Python抓取百度新闻的页面内容

简介 作为技术工程师,在繁忙的工作中我们不一定有时间浏览发生的热点新闻,但是懂技术的我们不需要访问网站来看当下发生的大事,我们可以使用网络爬虫的技术来获取当下最新最热的新闻,本文就来介绍一下使用Python抓取一下百度新闻…

鸿蒙APP和Android的区别

鸿蒙(HarmonyOS)和Android是两个不同的操作系统,它们有一些区别,包括架构、开发者支持、应用生态和一些设计理念。以下是鸿蒙APP和Android APP之间的一些主要区别,希望对大家有所帮助。北京木奇移动技术有限公司&#…

码牛课堂首推——鸿蒙南北双向开发学习路线图标准版~

鸿蒙!鸿蒙!鸿蒙! 要说2023-2024年IT圈最火爆的名词,一定是鸿蒙! 2023年9月25日,华为发布会正式宣布2024年第一季度将推出HarmonyOS NEXT版本,这意味着鸿蒙原生应用开发将彻底摆脱Android手机系…

了解Python中的requests.Session对象及其用途

前言 在Python的网络编程中,requests库是一个非常流行的HTTP客户端库,用于发送各种类型的HTTP请求。在requests库中,requests.Session对象提供了一种在多个请求之间保持状态的方法本文将探讨Python中的requests.Session对象及其用途&#xf…

大数据Doris(五十六):SQL函数之地理位置函数

文章目录 SQL函数之地理位置函数 一、​​​​​​​ST_AsText(GEOMETRY geo)

动态规划day09(打家劫舍,树形dp)

目录 198.打家劫舍 看到题目的第一想法 看到代码随想录之后的想法 自己实现过程中遇到的困难 213.打家劫舍II 看到题目的第一想法 看到代码随想录之后的想法 自己实现过程中遇到的困难 337.打家劫舍 III(树形dp) 看到题目的第一想法 看到代码随想录之后的想法 自己实…

cad的模型怎么打散导入3d---模大狮模型网

将CAD中的模型打散并导入3D建模软件,需要以下步骤: 将CAD中的模型进行分组或分层:在CAD中,将模型按照不同的组或层进行分组或分层。这样可以方便地控制每个部分的显示和隐藏,在导入3D建模软件后,也可以更方…

鸿蒙开发-UI-渲染控制

鸿蒙开发-序言 鸿蒙开发-工具 鸿蒙开发-初体验 鸿蒙开发-运行机制 鸿蒙开发-运行机制-Stage模型 鸿蒙开发-UI 鸿蒙开发-UI-组件 鸿蒙开发-UI-组件-状态管理 鸿蒙开发-UI-应用-状态管理 文章目录 前言 一、渲染控制概述 二、条件渲染 1.使用规则 2.更新机制 三、循环渲染 1.接口…

POI-tl 知识整理:整理1 -> 利用模板向word中写入数据

1 文本传值 Testpublic void testText() throws Exception {XWPFTemplate template XWPFTemplate.compile("D:\\Idea-projects\\POI_word\\templates.docx");Map<String, Object> map new HashMap<>();map.put("title", "Hi, girl"…

Python 自学(八) 之模块

目录 1. import语句导入模块 P206 2. from ... import 语句导入模块 P207 3. 模块的搜索目录 sys.path P209 4. 以主程序的形式执行 __name__ P212 5. python中的包 P213 1. import语句导入模块 P206 同一目录下&…

AI教我学编程之C#类的基本概念(1)

前言 在AI教我学编程之C#类型 中&#xff0c;我们学习了C#类型的的基础知识&#xff0c;而类正是类型的一种. 目录 区分类和类型 什么是类&#xff1f; 对话AI 追问 实操 追踪属性的使用 AI登场 逐步推进 提出疑问 药不能停 终于实现 探索事件的使用 异步/交互操作 耗时操…