go并发模式之----工作池/协程池模式

常见模式之四:工作池/协程池模式

定义

顾名思义,就是有固定数量的工人(协程),去执行批量的任务

使用场景

  • 适用于需要限制并发执行任务数量的情况

  • 创建一个固定大小的 goroutine 池,将任务分发给池中的 goroutine 并等待它们完成,使用带缓冲的通道来接收任务,以避免阻塞主线程

示例

有生产需求,建议使用大佬写的 ants库 ,以下是模拟协程池的简单示例

假设,我们有固定数量(2个)工人执行批量(4个)任务

package mainimport ("fmt""sync"
)type Task struct {TaskFunc func() interface{}
}type WorkerPool struct {Size    intWg      *sync.WaitGroupTasks   chan TaskResults chan Result
}type Result struct {ID  intRes interface{}
}func NewWorkerPool(workerNum, taskBufSize int) *WorkerPool {return &WorkerPool{Size:    workerNum,Wg:      &sync.WaitGroup{},Tasks:   make(chan Task, taskBufSize),Results: make(chan Result, taskBufSize),}
}func (w *WorkerPool) AddTask(task Task) {w.Tasks <- task
}func (w *WorkerPool) Run() {for i := 1; i <= w.Size; i++ {w.Wg.Add(1)go func(id int) {defer w.Wg.Done()w.Work(id, w.Tasks, w.Results)}(i)}
}func (w *WorkerPool) Work(Id int, tasks chan Task, results chan Result) {for task := range tasks {results <- Result{ID:  Id,Res: task.TaskFunc(),}}
}func main() {pool := NewWorkerPool(3, 10)pool.Run()pool.AddTask(Task{TaskFunc: func() interface{} {return 2 * 3}})pool.AddTask(Task{TaskFunc: func() interface{} {return 4 * 5}})pool.AddTask(Task{TaskFunc: func() interface{} {return 6 * 7}})pool.AddTask(Task{TaskFunc: func() interface{} {return 8 * 9}})close(pool.Tasks)go func() {pool.Wg.Wait()close(pool.Results)}()for v := range pool.Results {fmt.Println(v.ID, v.Res)}
}

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

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

相关文章

顺序表基础

⽬录 1. 课前准备 2. 顺序表概念及结构 3. 顺序表分类 4. 实现动态顺序表 正⽂开始 课前预备 1. 课程⽬标 C语⾔语法基础到数据结构与算法&#xff0c;前⾯已经掌握并具备了扎实的C语⾔基础&#xff0c;为什么要学习数据结构 课程&#xff1f;⸺通讯录项⽬ 2. 需要…

修改docker默认存储位置【高版本的docker】

一、修改docker默认存储位置 1、停服务 systemctl stop docker 2、修改/etc/docker/daemon.json添加新的dcoker路径 如"data-root": "/mnt/hdd1/docker" 3、保存后重启服务&#xff1a;systemctl restart docker 二、其他服务的命令 systemctl disab…

AcWing 787. 归并排序 解题思路及代码

先贴个题目&#xff1a; 以及原题链接&#xff1a;787. 归并排序 - AcWing题库https://www.acwing.com/problem/content/789/纯板子题&#xff0c;先贴代码吧&#xff0c;根据代码讲思路&#xff1a; #include <iostream> using namespace std;const int N 1e5 10; in…

【Maven】Maven 基础教程(三):build、profile

《Maven 基础教程》系列&#xff0c;包含以下 3 篇文章&#xff1a; Maven 基础教程&#xff08;一&#xff09;&#xff1a;基础介绍、开发环境配置Maven 基础教程&#xff08;二&#xff09;&#xff1a;Maven 的使用Maven 基础教程&#xff08;三&#xff09;&#xff1a;b…

TCP/UDP,HTTP、HTTPS存在什么风险会影响到网络安全吗

近年来&#xff0c;随着网络技术的飞速发展&#xff0c;互联网影响人们的方方面面&#xff0c;我们平时也接触到许多以前从未听过的东西&#xff0c;今天德迅云安全就来分享下一些互联网安全知识&#xff0c;讲解一些关于常看到的关于IP, TCP/UDP&#xff0c;HTTP、HTTPS这些名…

QT之液晶电子时钟

根据qt的<QLDNumber>做了一个qt液晶电子时钟. 结果 实时显示当前时间,左键可以拖动时钟在屏幕的位置,右键点击关闭显示. 实现过程 新建一个class文件,让这个文件的父类是QLCDNumber 相关功能变量定义和函数实现 .c文件代码 这里需要注意的一点是event->button是获取的…

SpringMVC自定义视图解析器

/** * 使用View接口完成请求转发|重定向 * 解释: * SpringMVC的官方&#xff0c;提供了一个叫做View的接口&#xff0c;告诉开发人员 * DispatcherServlet底层会调用View接口的实例化对象中的逻辑方法 * 来完成对应的请求转发和重定向。 * 使用: * 1. 单元方法的返回值为View接…

前台自动化测试:基于敏捷测试驱动开发(TDD)的自动化测试原理

一、自动化测试概述 自动化测试主要应用到查询结果的自动化比较&#xff0c;把借助自动化把相同的数据库数据的相同查询条件查询到的结果同理想的数据进行自动化比较或者同已经保障的数据进行不同版本的自动化比较&#xff0c;减轻人为的重复验证测试。多用户并发操作需要自动…

【开源】JAVA+Vue.js实现APK检测管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 开放平台模块2.3 软件档案模块2.4 软件检测模块2.5 软件举报模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 开放平台表3.2.2 软件档案表3.2.3 软件检测表3.2.4 软件举报表 四、系统展示五、核心代…

springBoot整合Redis(二、RedisTemplate操作Redis)

Spring-data-redis是spring大家族的一部分&#xff0c;提供了在srping应用中通过简单的配置访问redis服务&#xff0c;对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装&#xff0c;RedisTemplate提供了redis各种操作、异常处理及序列化&#xff0c;支持发布订阅&…

Android:BitmapFactory.decodeStream Bitmap的内存优化OutOfMemory异常以后Crash闪退

自己项目中使用如下方法&#xff0c;有的手机上会奔溃报错&#xff0c;原因是BitmapFactory.decodeStream部分没有使用options参数改变内存大小 改成如下形式后正常了&#xff1b;正确解决方案&#xff1a;设置inSampleSize 一&#xff09;Android BitmapFactory.decodeStream(…

C++利用汇编挖掘编程语言的本质..

1.谬论 很多非一手的资料特别是中文资料其实并不可靠 因为很多作者都是直接通过转载他人的作品 也不管他人作品真与假 而且有一部分的作品中的言论和官方描述相去甚远 有的则是翻译的过程中出现了问题 比如sizeof很多人认为是一个函数 其实他并不是一个函数 而是一个运算符 是…

档案数字化验收流程

档案数字化验收流程通常包括以下步骤&#xff1a; 1. 确定验收标准&#xff1a;制定档案数字化验收标准&#xff0c;明确要求检查的内容、质量要求、验收标准等。 2. 准备验收环境&#xff1a;为档案数字化验收准备合适的环境&#xff0c;包括验收场所、设备、人员等。 3. 准备…

vscode 引入外部依赖包

背景 我要在vscode中写一些antlr代码生成的cpp代码&#xff0c;但是在引入头文件#include "antlr4-runtime.h"的时候&#xff0c;出现报错&#xff0c;显示没有这个头文件&#xff0c;显然这是我们没有导入相关的包&#xff0c;因此我首先尝试了将antlr4的依赖源码在…

Semantic human matting

1.introduction 数据集包括&#xff0c;时尚模特数据集&#xff0c;超过18.8w张模特图&#xff0c;从中选出35311张图片&#xff0c;DIM数据集&#xff0c;仅包含人类的图像&#xff0c;202个前景图像&#xff0c;背景来自coco数据集和互联网&#xff0c;背景图不含人类&#x…

python 基础知识点(蓝桥杯python科目个人复习计划56)

今日复习内容&#xff1a;做题 例题1&#xff1a;最小的或运算 问题描述&#xff1a;给定整数a,b&#xff0c;求最小的整数x&#xff0c;满足a|x b|x&#xff0c;其中|表示或运算。 输入格式&#xff1a; 第一行包括两个正整数a&#xff0c;b&#xff1b; 输出格式&#…

小乌龟操作Git

1、选择小乌龟作为git客户端 最近使用idea来操作git的时候频频出现问题&#xff0c;要么是提交代码的时候少了某些文件&#xff0c;导致克隆下来无法运行&#xff0c;要么是提交速度太慢。 反正是在idea中操作git体验非常不好&#xff0c;所以决定来换一种方式来操作git。从网…

蓝桥杯算法题汇总

一.线性表&#xff1a;链式 例题&#xff1a;旋转链表 二.栈&#xff1a; 例题&#xff1a;行星碰撞问题 三.队列 三.数组和矩阵 例题&#xff1a;

FPGA-VGA成像原理与时序

什么是VGA: VGA, Video Graphics Array。即视频图形阵列,具有分辨率高、显示速率快、颜色丰富等优点。VGA接口不但是CRT显示设备的标准接口,同样也是LCD液晶显示设备的标准接口,具有广泛的应用范围。在FGPA中,常广泛用于图像处理等领域。 VGA 显示器成像原理 在 VGA 标准刚兴…

C语言 vs Rust应该学习哪个?

C语言 vs Rust应该学习哪个&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&am…