golang学习笔记05——golang协程池,怎么实现协程池?

  • 推荐学习文档
    • golang实战大纲
    • golang优秀开发常用开源库汇总
    • golang学习笔记01——基本数据类型
    • golang学习笔记02——gin框架及基本原理
    • golang学习笔记03——gin框架的核心数据结构
    • golang学习笔记04——如何真正写好Golang代码?

在这里插入图片描述

协程池是一种用于高效处理任务的机制,通过池中协程(称为 “工作者”)来并发执行任务。通过调整协程数量、使用缓冲通道、关闭协程池并监控其指标,可以优化协程池。协程池在实践中可用于处理大量并发任务、图像处理任务等,通过将任务提交给协程池,可以提高处理并发的效率。

GoLang 协程池的管理与优化

协程池概述

协程池是一种用于管理协程组的机制,它可以帮助避免创建和销毁协程的开销。协程池中的协程被称为 “工作者”,它们处理传入的任务。

协程池的好处

  • 减少协程创建的开销。
  • 提高任务处理并发度。
  • 允许任务在独立的上下文环境中执行。

协程池实现

在 GoLang 中,可以创建一个协程池来实现并发任务处理:

package mainimport ("fmt""sync""time"
)type Job struct {Data    intResult  chan int
}func main() {// 创建一个有缓冲的通道用于处理任务结果result := make(chan int, 10)// 创建一个协程池var wg sync.WaitGrouppool := make(chan *Job)for i := 0; i < 4; i++ {wg.Add(1)go func(pool chan *Job, wg *sync.WaitGroup) {defer wg.Done()for {job := <-pooljob.Result <- job.Data * job.Data}}(pool, &wg)}// 模拟任务处理for i := 0; i < 10; i++ {job := Job{Data:   i,Result: result,}pool <- &job}close(pool)wg.Wait()close(result)// 打印任务结果for r := range result {fmt.Println(r)}
}

优化协程池

以下是一些优化协程池的技巧:

  • 调整协程数量:协程数量应与系统资源和任务负载相匹配。过多或过少的协程都会影响性能。
  • 使用缓冲通道:在向协程池发送任务时,使用缓冲通道可以防止协程阻塞。
  • 关闭协程池:在不再需要协程池时,应使用 close() 函数关闭它,释放所有协程。
  • 监控协程池:使用诸如 Prometheus 之类的工具监控协程池的指标,例如协程数量和任务处理时间。

实战案例

在以下实战案例中,协程池用于处理图像处理任务:

package mainimport ("fmt""sync""time""image""image/jpeg""os"
)type Job struct {ImageFile    stringResultImage  chan<- image.Image
}func main() {resultChan := make(chan image.Image)// 创建一个协程池var wg sync.WaitGrouppool := make(chan *Job)for i := 0; i < 4; i++ {wg.Add(1)go func(pool chan *Job, wg *sync.WaitGroup) {defer wg.Done()for {job := <-poolimage, err := loadAndProcessImage(job.ImageFile)if err != nil {fmt.Println(err)continue}job.ResultImage <- image}}(pool, &wg)}// 将图像处理任务提交给协程池for {imageFile, ok := <-filesChan  // 从文件通道取文件if !ok {break}job := Job{ImageFile:   imageFile,ResultImage: resultChan,}pool <- &job}close(pool)wg.Wait()close(resultChan)// 保存处理后的图像for img := range resultChan {outputFile, err := os.Create("p_" + imgFile)if err != nil {fmt.Println(err)continue}if err := jpeg.Encode(outputFile, img, &jpeg.Options{Quality: 95}); err != nil {fmt.Println(err)outputFile.Close()continue}outputFile.Close()}
}

以上就是Golang协程池的实现详细内容,关注我看更多有意思的文章哦!👉👉

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

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

相关文章

面试—JavaSE

目录 面向对象三大特征 重载和重写的区别 final和static修饰符 接口和抽象类的区别 String、StringBuilder、StringBuffer的区别 面向对象三大特征 封装、继承、多态 封装 将对象的属性和方法放入到一个类中&#xff0c;通过访问修饰符来控制对类的访问权限 继承 继承是…

【ruby java】登陆功能/邮件发送模版240903

Rails 风格登录系统添加全面而详细的注释&#xff0c;解释每个部分的功能和用途。​​​​​​​​​ 详细注释&#xff0c;解释了每个文件和代码块的功能。以下是一些关键点的总结&#xff1a; 1. 控制器&#xff08;Controllers&#xff09;: - ApplicationController: …

苏茵茵:以时尚之名,诠释品质生活

在女性追求个性化与自我表达的今天&#xff0c;时尚早已超越了简单的穿着打扮&#xff0c;它成为女性展现自我风格、彰显独特魅力的重要方式。从广泛的兴趣爱好到精心雕琢的个人风格&#xff0c;每一处细节都闪耀着女性对个性独特与自我表达的深切渴望。正是这股不可阻挡的潮流…

强化学习指南:训练过程与评估过程的区别

强化学习指南&#xff1a;训练过程与评估过程的区别 在强化学习&#xff08;RL&#xff09;中&#xff0c;训练和评估是两个截然不同但密切相关的过程。本指南将详细解释这两个过程的区别&#xff0c;以及如何正确实施它们。 1. 训练过程 训练是RL中最核心的部分&#xff0c…

Java 中常用内置接口函数

在 Java 8 及以后的版本中&#xff0c;引入了许多函数式编程的特性&#xff0c;其中最重要的就是内置的函数式接口。这些接口使得编写更简洁、可读性更强的代码成为可能。今天我将介绍四个常用的内置接口&#xff1a;Predicate、Function、Consumer 和 Supplier&#xff0c;并提…

static 变量和 static 函数各有什么特点?

static 关键字在 C、C 等编程语言中用于指定变量和函数的存储类型和可见性&#xff0c;其特点如下&#xff1a; static 变量 作用域&#xff1a; 局部静态变量&#xff1a;在函数内部声明&#xff0c;作用域限制在该函数内&#xff0c;但其生命周期贯穿程序整个运行过程。它只…

关于schneider施耐德140模块

SCHNEIDER 140模块是施耐德电气&#xff08;Schneider Electric&#xff09;公司生产的一系列工业自动化和控制产品&#xff0c;这些模块通常用于Quantum系列PLC&#xff08;可编程逻辑控制器&#xff09;系统中&#xff0c;以实现各种自动化和控制任务。以下是对SCHNEIDER 140…

2024.9.9 Python,有效的括号,三数之和,回溯算法解决括号生成

1.有效的括号 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。…

使用Protocol Buffers传输数据

使用 Google Protocol Buffers&#xff08;ProtoBuf&#xff09;与 Kafka 结合来定义和传输数据&#xff0c;可以确保传输数据的结构性、可扩展性和高效性。以下是一个简单的步骤指南&#xff0c;帮助你实现生产者和消费者。 1. 定义 ProtoBuf 消息格式 首先&#xff0c;你需…

笔记整理—内核!启动!—kernel部分(3)init进程—进程1

内核态下干了什么——构建内核。 在init进程中&#xff0c;一个进程有两种状态。1为内核态&#xff0c;init属于内核进程。2.用户态&#xff0c;自己将init转为用户态。从进程1之后的进程就都可以工作在用户态。 内核态中重点干了一件事情&#xff0c;挂载rootfs&#xff0c;找…

ffmpeg 视频编码及基本知识

理论 H264编码原理&#xff08;简略&#xff09; 1. 视频为什么需要进行编码压缩 降低视频数据大小&#xff0c;方便存储和传输 2. 为什么压缩的原始数据采用YUV格式 彩色图像的格式是 RGB 的&#xff0c;但RGB 三个颜色是有相关性的。 采用YUV格式&#xff0c;利用人对图像的…

【C语言必学知识点七】什么?还有人不知道什么是柔性数组?还不速来!!!

动态内存管理——详细解读柔性数组 导读一、什么是柔性数组二、柔性数组的特点三、柔性数组的使用四、柔性数组的优势结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 在上一篇内容中我们介绍了C/C程序中的内存分区&#xff0c;在C/C…

C++11 --- 可变参数模板

序言 不知道大家有没有细细研究过在 C 语言 中的 printf 函数&#xff0c;也许我们经常使用他&#xff0c;但是我们可能并不是那么了解他。先看一下调用格式&#xff1a;int printf ( const char * format, ... );&#xff0c;在这里的 format 代表我们的输出格式&#xff0c;后…

欧拉下搭建第三方软件仓库—docker

1.创建新的文件内容 切换目录到etc底下的yum.repos.d目录&#xff0c;创建docker-ce.repo文件 [rootlocalhost yum.repos.d]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# vim docker-ce.repo 编辑文件,使用阿里源镜像源&#xff0c;镜像源在编辑中需要单独复制 h…

华为防火墙 nat64

如果设备接收到的IPv6报文的前缀是设备为NAT64定义的前缀&#xff0c;说明报文的目的地址是IPv4网络&#xff0c;报文将经过NAT64处理后被转发至IPv4网络。 如果设备接收到的IPv6报文的前缀不是设备为NAT64定义的前缀&#xff0c;说明报文的目的地址是IPv6网络&#xff0c;报文…

java直接实例化对象和使用接口实例化对象之间的区别(java小知识点)

文章目录 1.定义一个MyClass类和一个 MyInterface接口2.具体使用场景3.如何调用 MyClass 自己的特有方法&#xff1f;4.总结 1.定义一个MyClass类和一个 MyInterface接口 public interface MyInterface {void doSomething(); // 权限修饰符默认是public }public class MyClass…

设计模式 | 单例模式

定义 单例设计模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。这种模式常用于需要控制对某些资源的访问的场景&#xff0c;例如数据库连接、日志记录等。 单例模式涉…

网站钓鱼——挂马技术手段介绍

更多网安实战内容&#xff0c;可前往无问社区查看http://wwlib.cn/index.php/artread/artid/10194.html 网站挂马目前已经成为流氓软件以及红队人员快速获取目标主机权限的常用手段之一&#xff0c;在长时间的实战中也是出现了层出不穷的钓鱼方法&#xff0c;这次分享一下实际…

【北京迅为】《STM32MP157开发板使用手册》-第十三章 编译QtE5.12文件系统

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

内网中的RDP利用

学习参考 https://www.freebuf.com/articles/network/276242.html能跟着实操的都实操一下。熟悉一些命令&#xff0c;过程。 实验环境&#xff1a;win2008&#xff0c;192.168.72.139 两个用户&#xff1a; administrator&#xff0c;shizuru RDP服务 确定/开启 RDP服务确…