首页 > 其他分享 >理解 Go 语言的池Pool

理解 Go 语言的池Pool

时间:2024-07-30 18:55:45浏览次数:9  
标签:语言 对象 创建 sync 回收 Go Pool

        Go 是一种有自动垃圾回收机制的编程语言,采用三色并发标记算法标记对象并回收。和其他没有自动垃圾回收机制的编程语言不同,使用 Go 语言创建对象时,我们没有回收/释放的心理负担,想创建对象就创建,想用对象就用。

        但是,如果想使用 Go 语言开发一个高性能的应用程序,就必须考虑垃圾回收给性能带来的影响,毕竟 Go 的自动垃圾回收机制有一个STW(stop-the-world,程序暂停)的时间,而且在堆上大量地创建对象,也会影响垃圾回收标记的时间。所以,我们在做性能优化时,通常会采用对象池的方式,把不用的对象回收起来,避免被垃圾回收,这样使用时就不必在堆上重新创建对象了。

        不仅如此,像数据库连接、TCP 的长连接等,这些连接的创建也是一个非常耗时的操作。如果每次使用时都创建一个新的连接,则很可能整个业务的很多时间都花在了创建连接上。所以,如果能把这些连接保存下来,避免每次使用时都重新创建,则不仅可以大大减少业务的耗时,还能提高应用程序的整体性能。 

        这种模式被称为对象池设计模式(object pool pattern) 。一个对象池包含一组已经初始化过且可以重复使用的对象,池的用户可以从池子中获得对象,对其进行操作处理,并在不需要的时候归还给池子,而非直接销毁它。

        若初始化对象的代价很高,且经常需要实例化对象,但实例化的对象数量较少,那么使用对象池可以显著提升性能。从池子中获得对象的时间是可预测的且时间花费较少,而新建一个实例所需的时间是不确定的,可能时间花费较多。

        Go标准库中提供了一个通用的 Pool 数据结构,也就是 sync.Pool,我们使用它可以创建池化的对象。

1. sync.Pool 的使用方法

        首先,我们来介绍 Go 标准库中提供的 sync.Pool 数据类型。

        sync.Pool 数据类型用来保存一组可独立访问的 “临时” 对象。请注意这里加引号的 “临时” 两个字,它说明了 sync.Pool 这个数据类型的特点--其池化的对象会在未来某个时候被毫无征兆地移除。而且,如果没有别的对象引用这个要被移除的对象,该对象就会被垃圾回收。

        因为 Pool 可以有效地减少对新对象的申请,从而提高程序性能,所以 Go 内部库中也用到了 sync.Pool。比如 fmt 包,它会使用一个动态大小的 buffer 池做输出缓存,当大量的 goroutine 并发输出的时候,就会创建比较多的 buffer ,并且在不需要的时候被回收。

有两个知识点需要记住:

  • sync.Pool 本身就是线程安全的,多个 goroutine 可以并发地调用它的方法存取对象。
  • sync.Pool 不可在使用之后再复制使用。

        这个数据类型提供了三个对外的方法:New、Get 和 Put。

1. New:创建对象

        这里的 New 不是创建 Pool 类型的对象的方法,而是 Pool 对象创建其池化对象的方法。因为只有定义了创建池化对象的方法,它才能在需要的时候创建对像。

        Pool struct 包含一个 New 字段,这个字段的类型是函数 func() interface{ }。当调用 Pool 的 Get 方法从池中获取对象时,如果没有更多空闲的对象可用&#x

标签:语言,对象,创建,sync,回收,Go,Pool
From: https://blog.csdn.net/canglonghacker/article/details/140764172

相关文章

  • 深入浅出Django的路由系统:全面指南与实战示例
    Django的路由系统用于将用户请求的URL与相应的视图函数匹配,它决定了用户访问特定URL时会执行哪个视图函数。通过URL配置,路径匹配,路径参数,命名路由,路由命名空间,包含其他URL配置,以及反向解析,Django实现了高效且灵活的URL路由管理。1.URL配置URL配置是Django项目中定义URL与视......
  • 计算机毕业设计django/flask+uniapp私人定制商品订单系统hbuiderx微信小程序
    私人订制订单发布与对应商品出售平台方面的任务繁琐,以至于每年都在私人订制订单发布与对应商品出售平台这方面投入较多的精力却效果甚微,私人订制订单发布与对应商品出售平台的目标就是为了能够缓解私人订制订单发布与对应商品出售平台管理面临的压力,让私人订制订单发布与对......
  • go-zero 自定义中间件的几种方式
    目录1.通过api文件生成并填入具体逻辑定义api生成对应的模板填充中间件逻辑2.在server启动前完成中间件的注册定义中间件:注册到server中首先go-zero已经为我们提供了很多的中间件的实现,但有时难免有需求需要自定义,这里介绍几种自定义的方法,供参考。1.通过api文件生......
  • 大语言模型原理与工程实践:大语言模型微调的探索与展望
    大语言模型原理与工程实践:大语言模型微调的探索与展望作者:禅与计算机程序设计艺术/ZenandtheArtofComputerProgramming关键词:大语言模型,微调,机器学习,自然语言处理,工程实践1.背景介绍1.1问题的由来随着深度学习技术的飞速发展,大语言模型(LargeLanguageModel......
  • mongodb数据迁移mysql
    1、安装MongoDB参考链接https://blog.csdn.net/qq_45664055/article/details/119794071http://bbs.itying.com/topic/5bd675d80e525017c449479d1.1创建repo文件,MongoDB数据库不在yum的官方仓库,通过配置如下文件,可以通过yum下载MongoDBvi/etc/yum.repos.d/mongodb-org-4......
  • C语言 —— 函数递归
    目录1.什么是递归2.递归的思想3.递归的限制条件4.递归的举例4.1求n的阶乘4.2分析和代码实现4.3画图推演5.递归与迭代1.什么是递归递归是学习C语言函数绕不开的话题,那什么是递归呢?递归其实是一种解决问题的方法,在C语言中,递归就是函数自己调用自己。#inc......
  • Go并发编程入门
    本文由ChatMoney团队出品Go并发编程:Goroutines与Channels并发编程是Go语言的一个重要特点,它高效地利用现代硬件的多核和并行性来提升应用性能。本文将简介Go并发编程的基本概念,包括Goroutines和Channels。GoroutinesGoroutines是Go并发编程的基本单位,它们是轻......
  • 如何在 Django 中加载特定应用程序的模板?
    所以我正在高级学习Django,我已经知道如何包含manage.py所在的BASE_DIR中的模板。但是我想知道如何在Django中的特定应用程序中查找模板。例如,我有一个名为“mysite”的项目和一个名为polls的应用程序。现在,我在settings.pyDIRS=中添加了模板[os.path.join(BA......
  • 【嵌入式】C51 和标准 C 语言的关键字对比详解
    目录C51和标准C语言的关键字对比详解1.概述2.C51和标准C语言的关键字对比2.1关键字对比表2.2对比表详细解释2.2.1C51特定关键字2.2.2标准C语言关键字2.3C51特定关键字2.4标准C语言关键字3.示例详细解释3.1C51特定关键字`bit``sfr``sbit``data`......
  • 计算机毕业设计django+vue《Python数据分析》的教学系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今数字化时代,数据分析已成为各行各业不可或缺的技能之一,而Python作为数据分析领域的首选语言,其重要性日益凸显。然而,传统的教学模式在......