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

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

定义

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

使用场景

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

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

示例

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

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

package main

import (
	"fmt"
	"sync"
)

type Task struct {
	TaskFunc func() interface{}
}

type WorkerPool struct {
	Size    int
	Wg      *sync.WaitGroup
	Tasks   chan Task
	Results chan Result
}

type Result struct {
	ID  int
	Res 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.mfbz.cn/a/421310.html

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

相关文章

学习:GPT-4技术报告2023.3

原文链接&#xff1a;GPT-4的 (openai.com) 摘要&#xff1a; 我们创建了 GPT-4&#xff0c;这是 OpenAI 在扩展深度学习方面的最新里程碑。GPT-4 是一个大型多模态模型&#xff08;接受图像和文本输入&#xff0c;发出文本输出&#xff09;&#xff0c;虽然在许多现实世界场…

MySQL 多表查询 连接查询 外连接

介绍 MySQL 多表查询 连接查询 内连接 外连接分为两种&#xff0c;左外和右外连接&#xff0c; 左外&#xff1a;相当于查询表1(左表)的所有数据 包含 表1和表2交集部分的数据,完全包含左表的数据 右外&#xff1a;相当于查询表2(右表)的所有数据 包含 表1和表2交集部分的数据…

c语言的数据结构:队列

1.队列存在的实现方式及其存在意义 1.1为什么队列使用单链表实现更好 动态内存分配&#xff1a;链表在C语言中通常使用动态内存分配&#xff0c;这意味着可以在运行时根据需要动态地添加或删除节点。这对于实现一个动态大小的队列非常有用&#xff0c;因为队列的大小可以在运…

达梦数据库基础操作(二):表空间操作

达梦数据库基础操作(二)&#xff1a;表空间操作 1. 表空间操作 1.1 达梦表空间介绍 表空间的概念&#xff1a; 每个DM 数据库都是由一个或者多个表空间组成&#xff0c;表空间是一个逻辑的存储容器&#xff0c;它位于逻辑结构的顶层&#xff0c;用于存储数据库中的所有数据&am…

11-orm-自研微服务框架

ORM 当开发涉及到存储数据的时候&#xff0c;往往要用到数据库&#xff0c;用的最多的就是mysql了&#xff0c;这里我们实现一个orm&#xff0c;让开发者更加便捷的操作数据库 1. Insert实现 orm的本质就是拼接sql&#xff0c;让开发者更加方便的使用 package ormimport ("…

(二)电机控制之六步方波BLDC控制方法以及注意问题

一、直流无刷电机的简介 直流无刷电机&#xff08;Brushless Direct Current Motor&#xff0c;简称BLDC电机或BL电机&#xff09;是一种先进的电动机类型&#xff0c;其设计结合了直流电机的调速性能和交流电机的结构优势。这种电机没有传统的机械换向器和碳刷组件&#xff0…

安达发|APS自动排程软件的三种模式

APS自动排程软件是一种用于生产计划和调度的工具&#xff0c;它可以帮助制造企业实现生产过程的优化和效率提升。根据不同的需求和应用场景&#xff0c;APS自动排程软件通常有三种模式&#xff1a;基于模拟仿真模式、基于TOC的模式和扩展以及基于数学建模。下面我将详细介绍这三…

基于Python3的数据结构与算法 - 08 NB三人组小结

一、总结 三种排序算法得时间复杂度都是O(nlogn) &#xff08;存在常数之间的差异&#xff09;一般情况下&#xff0c;就运行时间而言&#xff1a;快速排序 < 归并排序 < 堆排序三种方法的缺点&#xff1a; 快速排序&#xff1a;极端情况下排序效率低归并排序&#xf…

【服务器数据恢复】昆腾存储中raid5磁盘阵列数据恢复案例

服务器数据恢复环境&故障&#xff1a; 10个磁盘柜&#xff0c;每个磁盘柜配24块硬盘。9个磁盘柜用于存储数据&#xff0c;1个磁盘柜用于存储元数据。 元数据存储中24块硬盘&#xff0c;组建了9组RAID1阵列1组RAID10阵列&#xff0c;4个全局热备硬盘。 数据存储中&#xff0…

windows安装pytorch(anaconda安装)

文章目录 前言一、安装anaconda1、进入官网下载&#xff08;1&#xff09;点击view all Installers&#xff08;2&#xff09;下载需要的版本 2、一顿默认安装就行&#xff08;到这一步这样填&#xff09;3、进入开始找到Anaconda Prompt&#xff0c;点击进入到base环境 二、新…

剑指offer面试题28:对称的二叉树

#试题28&#xff1a;对称的二叉树 题目&#xff1a; 请设计一个函数判断一棵二叉树是否 轴对称 。 示例 1&#xff1a; 输入&#xff1a;root [6,7,7,8,9,9,8] 输出&#xff1a;true 解释&#xff1a;从图中可看出树是轴对称的。示例 2&#xff1a; 输入&#xff1a;root …

Ps:海绵工具

海绵工具 Sponge Tool可用于调整图像中特定区域的饱和度&#xff0c;常用于增加或减少颜色的饱和度。 快捷键&#xff1a;O 在特别的灰度图像上&#xff0c;则可用于调整对比度&#xff0c;这可以开发出更多的创意技巧。 ◆ ◆ ◆ 常用操作方法与技巧 1、海绵工具主要用于调整…

leetcode 热题 100_最长连续序列

题解一&#xff1a; 哈希表&#xff1a;找连续最长的数字序列&#xff0c;很容易联想到排序&#xff0c;但排序的时间复杂度O(nlogN)过大&#xff0c;判题容易超时。因此我们需要使用哈希表来快速查找&#xff0c;序列中是否存在与某个数相邻的数。用HashSet建立哈希表并去重&a…

叠氮生物素,Biotin-azide ,含有生物素基团和叠氮基团

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;生物素-叠氮&#xff0c;生物素叠氮&#xff0c;叠氮生物素&#xff0c;Biotin-azide &#xff0c;Azide-Biotin&#xff0c;Biotin-N3&#xff0c;N3-Biotin&#xff0c;908007-17-0 一、基本信息 【产品简介】&a…

PHP使用imap_open读取QQ邮箱

PHP代码&#xff1a; /** PHP使用imap_open读取QQ邮箱imap_open 官方文档&#xff1a;https://www.php.net/function.imap_open */function parse_mailstr($subject) {$a explode(?,$subject);$n count($a);$a $a[$n-2];return base64_decode($a); }function recevie_emai…

GEE:使用Sigmoid激活函数对单波段图像进行变换(以NDVI为例)

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine (GEE)平台上,对任意单波段影像进行 Sigmoid 变换的代码。并以对 NDVI 影像像素值的变换为例。 文章目录 一、Sigmoid激活函数1.1 什么是 Sigmoid 激活函数1.2 用到遥感图像上有什么用?二、代码链接三、完整代码一…

蓝桥杯练习系统(算法训练)ALGO-995 24点

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 24点游戏是一个非常有意思的游戏&#xff0c;很流行&#xff0c;玩法很简单&#xff1a;给你4张牌&#xff0c;每张牌上有数…

【Python笔记-FastAPI】后台任务+WebSocket监控进度

目录 一、代码示例 二、执行说明 (一) 调用任务执行接口 (二) 监控任务进度 实现功能&#xff1a; 注册后台任务&#xff08;如&#xff1a;邮件发送、文件处理等异步场景&#xff0c;不影响接口返回&#xff09;监控后台任务执行进度&#xff08;进度条功能&#xff09;支…

【JavaSE】 P165 ~ P194 抽象方法,抽象类,接口,接口内容,多接口实现和父类继承,多态,向上转型,向下转型

目录 抽象抽象的概念抽象方法和抽象类的格式抽象方法和抽象类的使用抽象方法和抽象类的注意事项● 练习1. 写一个父类图形类&#xff0c;其中有方法&#xff0c;功能计算面积为抽象方法。2. 抽象类继承。判断对错,没错的分析运行结果3. 发红包,群内用户类作为父类&#xff0c;有…

借助ChatGPT使用Python搭建一个工具网站

文章目录 前言网站搭建过程总结 前言 不知不觉ChatGPT已经风靡一年多了&#xff0c;现在基本每天工作时都会用到&#xff0c;相比于传统的搜索引擎它究竟强在哪呢&#xff1f;我觉得以往的搜索引擎是一个机器&#xff0c;你给它关键信息它能返回匹配关键词的内容数据&#xff…
最新文章