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

news2024/11/20 7:48:25

字节池(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从队列中取出任务进行执行

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爬虫开发工具与环境搭建——使用Postman和浏览器开发者工具

第三节&#xff1a;使用Postman和浏览器开发者工具 在网络爬虫开发过程中&#xff0c;我们经常需要对HTTP请求进行测试、分析和调试。Postman和浏览器开发者工具&#xff08;特别是Network面板和Console面板&#xff09;是两种最常用的工具&#xff0c;能够帮助开发者有效地捕…

vue2侧边导航栏路由

<template><div><!-- :default-active"$route.path" 和index对应其路径 --><el-menu:default-active"active"class"el-menu-vertical-demo"background-color"#545c64"text-color"#fff"active-text-col…

时代变迁对传统机器人等方向课程的巨大撕裂

2020年之后&#xff0c;全面转型新质课程规划&#xff0c;传统课程规划全部转为经验。 农耕-代表性生产关系-封建分配制度主要生产力-人力工业-代表性生产关系-资本分配制度工业分为机械时代&#xff0c;电气时代&#xff0c;信息时代&#xff1b;主要生产力-人力转为人脑&…

JVM类加载过程-Loading

一、Class对象的生命周期 .class文件是如何加载到内存中:.class文件是ClassLoader通过IO将文件读到内存,再通过双亲委派的模式进行Loading,再Linking、以及Initializing,代码调用等一系列操作后,进行GC,组成完整的生命周期; 二、双亲委派模式(Loading的过程): 1、类…

BERT--公认的里程碑

前言 如果说&#xff0c;让我选Transformer架构的哪个模型最深入人心&#xff0c;我将毫不犹豫的选择BERT&#xff01; BERT 的意义在于&#xff0c;从大量无标记的数据集中训练得到的深度模型&#xff0c;可以限制提高各项自然语言处理任务的准确率。 BERT 在当时&#xff0…

<项目代码>YOLOv8 瞳孔识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

每日OJ题_牛客_天使果冻_递推_C++_Java

目录 牛客_天使果冻_递推 题目解析 C代码 Java代码 牛客_天使果冻_递推 天使果冻 描述&#xff1a; 有 n 个果冻排成一排。第 i 个果冻的美味度是 ai。 天使非常喜欢吃果冻&#xff0c;但她想把最好吃的果冻留到最后收藏。天使想知道前 x个果冻中&#xff0c;美味…

果韵 2.0.1| 听歌神器,双端支持,支持下载歌曲和歌词

果韵是一款支持Windows和安卓双端的音乐播放器&#xff0c;支持自定义音源&#xff0c;界面简洁。用户可以通过缓存下载歌曲和歌词。为了使用这些功能&#xff0c;需要先进行音源导入。通过设置中的存储设置&#xff0c;将缓存文件夹移动到download目录下&#xff0c;之后缓存的…

Allegro从.brd文件中导出器件ball map

Step 1&#xff08;可选&#xff09;&#xff1a;设置网络颜色 Step2&#xff1a;File->Export->Symbol Spreadsheet\ Step3&#xff1a;Primary text选择Net Name Step 4&#xff1a;在.brd所有文件夹下生成一个ball map文件&#xff0c;其中网络颜色与Step 1一致。ba…

Docker入门之Windows安装Docker初体验

在之前我们认识了docker的容器&#xff0c;了解了docker的相关概念&#xff1a;镜像&#xff0c;容器&#xff0c;仓库&#xff1a;面试官让你介绍一下docker&#xff0c;别再说不知道了 之后又带大家动手体验了一下docker从零开始玩转 Docker&#xff1a;一站式入门指南&#…

家庭网络常识:猫与路由器

这张图大家应该不陌生——以前家庭网络的连接方式。 图1 家庭网络连接示意图 来说说猫/光猫&#xff1a; 先看看两者的图片。 图2 猫 图3 光猫 这个东西因为英文叫“modem”&#xff0c;类似中文的“猫”&#xff0c;所以简称“猫”。 猫和光猫的区别就是&#xff0c;一…

三种复制只有阅读权限的飞书网络文档的方法

大家都知道&#xff0c;飞书是一款功能强大的在线协作工具&#xff0c;可以帮助团队更高效地协作和沟通。越来越多的资料都在使用飞书文档&#xff0c;在使用飞书的过程中&#xff0c;发现很多文档没有复制权限&#xff0c;如果想要摘抄笔记&#xff0c;只能一个字一个字地敲出…

elasticsearch的倒排索引是什么?

大家好&#xff0c;我是锋哥。今天分享关于【elasticsearch的倒排索引是什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; elasticsearch的倒排索引是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 倒排索引&#xff08;Inverted Index&a…

基于Java Springboot甘肃旅游管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

uniApp项目运行到鸿蒙手机,应用图标一直是H,应用名一直是HBuilder问题

项目运行到鸿蒙手机&#xff0c;应用图标一直是H,应用名一直是HBuilder问题 应用运行到鸿蒙手机和鸿蒙模拟器&#xff0c;应用图标一直是H,应用名一直是HBuilder&#xff0c;在自动生成的harmony-configs文件夹下也没有配置的文件&#xff0c; 这时候需要你将DevEco Studio 下…

Python3.11.9+selenium,获取图片验证码以及输入验证码数字

Python3.11.9+selenium,获取图片验证码以及输入验证码数字 1、遇到问题:登录或修改密码需要验证码 2、解决办法: 2.1、安装ddddocr pip install ddddocr 2.2、解析验证码函数 import ddddocr def get_capcha_text():#获取验证码图片ele_pic = driver.find_element(By.XPAT…

中伟视界:AI智能分析算法如何针对非煤矿山的特定需求,提供定制化的安全生产解决方案

非煤矿山智能化改造&#xff0c;除了政策文件&#xff0c;上级监管单位需要安装的AI智能分析算法功能之外的&#xff0c;矿方真正关心的&#xff0c;能解决矿方安全生产隐患的AI智能分析算法功能有哪些呢&#xff1f; 经过与矿方的现场交流沟通&#xff0c;收集第一现场人员对安…

【论文速读】| 迈向自动化渗透测试:引入大语言模型基准、分析与改进

基本信息 原文标题&#xff1a;Towards Automated Penetration Testing: Introducing LLM Benchmark, Analysis, and Improvements 原文作者&#xff1a;Isamu Isozaki, Manil Shrestha, Rick Console, Edward Kim 作者单位&#xff1a;Drexel University, Independent 关键…

【Visual Studio系列教程】如何在 VS 上编程?

上一篇博客中&#xff0c;我们介绍了《什么是 Visual Studio&#xff1f;》。本文&#xff0c;我们来看第2篇《如何在 VS 上编程&#xff1f;》。阅读本文大约10 分钟。我们会向文件中添加代码&#xff0c;了解 Visual Studio 编写、导航和了解代码的简便方法。 本文假定&…

项目进度计划表:详细的甘特图的制作步骤

甘特图&#xff08;Gantt chart&#xff09;&#xff0c;又称为横道图、条状图&#xff08;Bar chart&#xff09;&#xff0c;是一种用于管理时间和任务活动的工具。 甘特图由亨利劳伦斯甘特&#xff08;Henry Laurence Gantt&#xff09;发明&#xff0c;是一种通过条状图来…