go语言进阶之字节池与工作池

字节池(byte pool)

在go语言中,字节池是一种用来管理和复用字节切片的内存池。使用字节池可以减少内存分配和垃圾回收的压力,尤其是在频繁使用内存的场景中,如网络编程、文件操作和高并发服务中。

概念学习

什么是字节切片

字节切片(Byte Slice)通常是指用于表示一段连续的字节数组的结构。其核心思想在于提供对自己序列的灵活访问和操作

其中,字节指数据存储的基本单位,切片指从一段数据结构中提取出的一部分内容。

在很多编程语言中,字节切片是用来处理原始二进制数据的一种方式,字节切片通常没有固定长度,可以动态调整。

什么是字节池

字节池是一种内存管理机制,通常用于优化内存的分配和释放,尤其是在高频率的内存操作中,它通过预先分配一块内存池,并跟进需求从池中获取或释放内容,避免了频繁的进行内存分配和释放操作。

字节池的工作原理主要是预先分配一块大内存,当程序需要内存时,从池中取出一定大小的内存,而不是每次都从操作系统中申请,当内存使用完后,返回自己池中等待下一次使用

基本实现

在了解了基本概念后,就可以进入go语言的字节池学习。

go语言中使用的是sync.Pool来创建字节池。

package main

import (
	"fmt"
	"sync"
)

var bytePool = sync.Pool{
	// New 是 sync.Pool 中的一个方法,用来定义获取对象的方式。
	New: func() interface{} {
		// 每次从池中获取不到对象时会调用这个方法来创建新的对象
		return make([]byte, 1024) // 返回一个大小为 1024 字节的切片
	},
}

func main() {
	// 从字节池中获取一个字节切片
	buf := bytePool.Get().([]byte)

	// 使用 buf 做一些操作
	fmt.Printf("buf length: %d\n", len(buf))

	// 使用完字节切片后,放回池中复用
	bytePool.Put(buf)
}

在这段代码中主要有以下3个阶段:

  1. sync.Poll():提供了一个机制来池化对象,以减少内存的分配和垃圾回收,它的New函数定义了当池为空时应该如何创建新对象
  2. bytePoll.Get():从池中获取一个字节切片,如果池中没有对象,New函数会被用来创建一个新的对象
  3. bytePool.Put(buf):将使用过的字节切片放回池中

工作池(Worker Pool)

在go语言中,工作池是一种常见的并发模式,用于管理和调整多个工作任务,通过工作池可以控制并发工作任务的数量,避免过多goroutine同时执行导致系统资源损耗或性能下降。

当然我们也可以将工作池理解为线程池,其主要作用也差不多。

基本实现

package main

import (
	"fmt"
	"sync"
	"time"
)

// 定义任务的类型,任务可以是一个简单的函数
type Task struct {
	ID int
}

// 工作池中的工作函数
func worker(id int, tasks <-chan Task, wg *sync.WaitGroup) {
	defer wg.Done() // 完成后通知 WaitGroup

	for task := range tasks {
		// 模拟任务处理
		fmt.Printf("Worker %d processing task %d\n", id, task.ID)
		time.Sleep(1 * time.Second) // 模拟任务处理的时间
	}
}

// 创建工作池函数
func createWorkerPool(numWorkers int, tasks <-chan Task) *sync.WaitGroup {
	var wg sync.WaitGroup

	// 启动工作 goroutine
	for i := 1; i <= numWorkers; i++ {
		wg.Add(1)
		go worker(i, tasks, &wg)
	}

	return &wg
}

func main() {
	// 创建一个任务队列
	tasks := make(chan Task, 10)

	// 创建工作池,假设池中有 3 个工作 goroutine
	wg := createWorkerPool(3, tasks)

	// 模拟生成任务并添加到任务队列中
	for i := 1; i <= 10; i++ {
		tasks <- Task{ID: i}
	}

	// 关闭任务队列,表示没有更多的任务
	close(tasks)

	// 等待所有工作 goroutine 完成
	wg.Wait()
}

这段代码先定义了一个Task类型,其代表一个类型,每个任务有一个ID

然后工作函数worker是每个工作goroutine执行的内容,每个工作goroutine从任务对了中获取任务并处理,直到队列为空

createWorkerPool函数主要用于接受工作的goroutine的数量numWorkers和任务队列tasks,并启动对应数量的工作goroutine来并发执行任务

然后使用一个有缓存tasks作为任务队列,并将任务放入队列中,goroutine从队列中取出任务进行执行

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

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

相关文章

C++为函数提供的型特性——缺省参数与函数重载

目录 一、缺省参数 二、函数重载 一、缺省参数 C为函数提供了一项新的特性——缺省参数。缺省参数指的是当前函数调用中省略了实参自动使用的一个值。这极大地提高了函数的灵活性 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值 。在调⽤该函数时&#xff0c;如果没有…

前端框架Vue3基础部分

什么是Vue&#xff1f; Vue是一个能用于构建用户交互页面&#xff08;动态网页&#xff09;的渐进式JavaScript框架&#xff0c;易学易用&#xff0c;性能出色&#xff0c;适用性强的Web前端框架。 Vue的设计模式&#xff1f; Vue的设计模式&#xff1a;MVVM模式 MVVM设计模…

安达发|APS自动排程软件异常预警处理场景介绍

APS生产排单软件通过预先设定好相关基本资料与约束规则&#xff0c;当订单、机台、工具、材料、上下班时间等任何影响生产计划的因素变化后&#xff0c;只需执行“一键式排程计算”&#xff0c;系统即可生成相应的生产计划。它不仅能够高效地安排生产任务&#xff0c;优化资源分…

在阿里云快速启动Appsmith搭建前端页面

什么是Appsmith Appsmith是一个开源的低代码开发平台&#xff0c;它使得开发者能够快速地构建内部工具、业务管理系统、CRM系统等。Appsmith通过提供一系列预建的UI组件&#xff08;如表格、图表、表单等&#xff09;&#xff0c;以及对数据库、API调用的直接支持&#xff0c;…

命令执行简单(棱角社区有毒)

前言&#xff1a;小迪安全2022第一节反弹shell&#xff0c;小迪用的是两台都是云服务器&#xff0c;没有服务器可以在自己的主机上搭建也是可以的&#xff0c;主机上搭两个网站 思路&#xff1a;生成一个木马文件&#xff0c;下载到本机&#xff0c;然后利用本机上传到目标主机…

基于Ruoyi的同一token跨系统访问,后端单点登录并且鉴权方案

基于Ruoyi的同一token跨系统访问,后端单点登录并且鉴权方案 需求场景以及先决条件默认方案改造思路改造代码,一共4个类需要变更完整需要修改的代码 需求场景以及先决条件 同一环境下的多个ruoyi项目,各自使用相同的一组用户(我这里用的是LDAP的登录,不影响本文),但是每个权限拥…

图像/文字差异类型验证码识别 无需训练

某像差异在个别全家桶验证方便有使用&#xff0c;对于这种验证码类型如下&#xff1a; 首先还是目标检测&#xff0c;直接用 dddd 自带的detection 就足够了。 特征提取 其次经过观察&#xff0c;差异答案与其他三个无非就是颜色&#xff0c;字体&#xff0c;方向&#xff0c…

【AI+教育】一些记录@2024.11.16

《万字长文&#xff0c;探讨关于ChatGPT的五个最核心问题》 万字长文&#xff0c;探讨关于ChatGPT的五个最核心问题关于 ChatGPT 铺天盖地的信息让人无所适从。本文则试图提炼出五个关键问题&#xff1a;如何理解这次范式突破&#xff0c;未来能达到的技术天花板&#xff0c;行…

Java-04 深入浅出 MyBatis - SqlSessionFactory 与 SqlSession DAO与Mapper 代理模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

在Unity中使用Epplus写Excel

Overview 本文旨在帮助你快速入门,该库发展多年内容庞大(官方文档写的极好:https://github.com/EPPlusSoftware/EPPlus/wiki),有些功能在Unity环境可能你永远都不会使用. 官方的一个Demo: https://github.com/EPPlusSoftware/EPPlus.Samples.CSharp 如果你只有读的需求,可以…

leetcode 删除有序数组的重复项

26. 删除有序数组中的重复项 已解答 简单 相关标签 相关企业 提示 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 n…

HNUST-党校培训自动下一集油猴脚本

1.起初 好烦&#xff0c;这个系统看视频需要一直点按键&#xff0c;还没有自动下一集的功能&#xff0c;于是就有了这个js代码 2.效果 实现自动点击是否观看&#xff0c;检测按键自动播放下一集 3.代码(你需要下载油猴&#xff0c;打开管理面板&#xff0c;新建代码) // UserS…

深入了解 GIS 地理信息系统和前端五大 GIS 技术,GIS地理信息系统介绍及前端五大 GIS 技术解析

目录 前言 地理信息系统 (GIS) 是现代数据化社会的重要工具&#xff0c;广泛应用于智慧城市、环境保护、交通管理等领域。随着 Web 前端技术的发展&#xff0c;GIS 可视化在浏览器端的表现能力越来越强&#xff0c;成为许多开发者关注的焦点。这里分享记录 GIS 的基础知识&am…

美团单车上线暖手套,美团贴心服务会给市场带来什么?

首先&#xff0c;美团单车上线暖手套这一举措主要是为了提升市民在秋冬季节骑行共享单车、电单车的出行体验。这一贴心的设计能够解决骑行者在寒冷天气中手部受冻的问题&#xff0c;使得骑行更加舒适和安全。 其次&#xff0c;美团的这一贴心服务会对市场产生积极影响。一方面…

Mysql-DQL语句

文章目录 DQL 语句简单查询查询表所有数据查询指定列 别名查询清除重复值查询结果参与运算 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Mysql专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月16日11点39分 DQL 语句 DQL 语句数据…

【cpp中的继承】

什么是继承&#xff1f; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&…

iOS 18 导航栏插入动画会导致背景短暂变白的解决

问题现象 在最新的 iOS 18 系统中,如果我们执行导航栏的插入动画,可能会造成导航栏背景短暂地变为白色: 如上图所示:我们分别向主视图和 Sheet 弹出视图的导航栏插入了消息,并应用了动画效果。可以看到,前者的导航栏背景会在消息插入那一霎那“变白”,而后者则没有任何…

《Java核心技术 卷I》Collection接口和迭代器

Collection接口 Java类库中&#xff0c;集合类的基本接口是Collection接口&#xff0c;两个基本方法&#xff1a; public interface Collection<E>{boolean add(E element);Iterator<E> iterator();...... } add方法用于向集合中添加元素&#xff0c;如果元素确…

《Python制作动态爱心粒子特效》

一、实现思路 粒子效果&#xff1a; – 使用Pygame模拟粒子运动&#xff0c;粒子会以爱心的轨迹分布并运动。爱心公式&#xff1a; 爱心的数学公式&#xff1a; x16sin 3 (t),y13cos(t)−5cos(2t)−2cos(3t)−cos(4t) 参数 t t 的范围决定爱心形状。 动态效果&#xff1a; 粒子…

109. UE5 GAS RPG 实现检查点的存档功能

在这一篇文章里&#xff0c;我们接着实现存档的功能&#xff0c;保存当前玩家的生成位置&#xff0c;游戏里有很多中方式去实现玩家的位置存储&#xff0c;这里我们采用检查点的方式&#xff0c;当玩家接触到当前检查点后&#xff0c;我们可以通过检查点进行保存玩家的状态&…