go 协程池的实现

使用场景

这次需求是做一个临时的数据采集功能,为了将积压的数据快速的消耗完,但是单一的脚本消耗的太慢,于是乎就手写了一个简单的协程池:

  1. 为了能加快数据的收集速度
  2. 为了稳定协程的数量,让脚本变得稳定

设计图如下

在这里插入图片描述
协程池中提供了三个方法:

  1. 一个是Addjob用来将任务加入到任务池中
  2. Do 是用来消耗任务池中的任务
  3. HandleErrors 用来获取到错误信息
  4. Stop 是当脚本停止以后,不会立刻停止而是等待所有的人物消耗光在停止

代码如下

该协程池是借用了go扩展库中的semaphore来实现的。

  1. semaphore 信号量是一种同步机制,用于控制对共享资源的访问,常用于限制可以同时访问某一资源或资源池的线程数量。
  2. 我使用的是Acquire函数来实现的,Acquire 当资源访问量达到上限时会被阻塞,直到有协程执行完成,所以我们这里需要对Acquire的上下文设置超时时间,防止我们的任务出现死任务无法退出,从而导致整个协程池堵死。
  3. 我们在任务执行完成后要通过Release来释放资源,防止我们池子越变越小。
package poolimport ("context""sync""time""golang.org/x/sync/semaphore"
)type GoPool struct {MaxNum intJobs   chan func() errorsem    *semaphore.Weightedwg     *sync.WaitGroupErrs   chan error
}func NewGoPool(num int) *GoPool {return &GoPool{MaxNum: num,Jobs:   make(chan func() error, num),sem:    semaphore.NewWeighted(int64(num)),wg:     &sync.WaitGroup{},Errs:   make(chan error, num),}
}func (g *GoPool) Do() {go g.gAcquire()
}func (g *GoPool) AddJob(f func() error) {g.Jobs <- f
}func (g *GoPool) gAcquire() {for {ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)select {case job, ok := <-g.Jobs:if !ok {cancel()return}g.wg.Add(1)if err := g.sem.Acquire(ctx, 1); err != nil {// g.Errs <- errg.wg.Done()cancel() // 确保在退出前取消contextbreak}go func() {defer g.sem.Release(1)defer g.wg.Done()if err := job(); err != nil {g.Errs <- errreturn}}()case <-ctx.Done():returndefault:continue}}
}func (g *GoPool) Stop() {close(g.Jobs)g.wg.Wait()close(g.Errs)
}func (g *GoPool) HandleErrors(handler func(error)) {for err := range g.Errs {handler(err)}
}

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

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

相关文章

数据增强:机器学习中的数据魔法

数据增强&#xff1a;机器学习中的数据魔法 在机器学习领域&#xff0c;数据是模型训练的基石。然而&#xff0c;获取大量高质量的训练数据往往是一个挑战。数据增强技术应运而生&#xff0c;它通过从现有数据中生成新的变体来增加数据集的多样性和丰富性。本文将深入探讨数据…

微服务分布式事务

1、分布式事务是什么&#xff1f; 微服务架构中的分布式事务是指在多个服务实例之间保持数据一致性的机制。由于微服务通常涉及将业务逻辑拆分成独立的服务&#xff0c;每个服务可能有自己的数据库&#xff0c;因此当一个业务操作需要跨多个服务进行时&#xff0c;确保所有服务…

sbti科学碳目标倡议是什么

在科学界、工业界以及全球政策制定者的共同努力下&#xff0c;一个名为“科学碳目标倡议”&#xff08;Science Based Targets initiative&#xff0c;简称SBTi&#xff09;的全球性合作平台应运而生。这一倡议旨在推动企业和组织设定符合气候科学要求的减排目标&#xff0c;以…

2023年国际高校数学建模竞赛

2023年国际高校数学建模竞赛是一项由国际(澳门)学术研究院数学科学研究所、数学建模研究与应用期刊社联合香港数学研究与应用学会主办的国际性学科竞赛&#xff0c;该竞赛已获澳门特别行政区政府澳门基金会&#xff08;行政长官直属&#xff09;立项资助。以下是对该竞赛的详细…

生成式AI未来发展方向充满了无限可能与挑战

生成式AI&#xff0c;作为人工智能领域的一个前沿分支&#xff0c;其未来发展方向充满了无限可能与挑战&#xff0c;将对多个行业产生深远影响。以下是我对生成式AI未来发展方向的几点看法&#xff1a; 技术融合与创新 未来&#xff0c;生成式AI将更加注重与其他技术的深度融合…

问题记录-SpringBoot 2.7.2 整合 Swagger 报错

详细报错如下 报错背景&#xff0c;我将springboot从2.3.3升级到了2.7.2&#xff0c;报了下面的错误&#xff1a; org.springframework.context.ApplicationContextException: Failed to start bean documentationPluginsBootstrapper; nested exception is java.lang.NullPo…

信息收集Part3-资产监控

Github监控 便于收集整理最新exp或poc 便于发现相关测试目标的资产 各种子域名查询 DNS,备案&#xff0c;证书 全球节点请求cdn 枚举爆破或解析子域名对应 便于发现管理员相关的注册信息 通过Server酱接口接收漏洞信息 https://sct.ftqq.com/ https://github.com/easych…

从苏宁电器到卡巴斯基(第二部)第36篇:我当高校教师的这几年 XII

你们是八九点钟的太阳 想想也是有趣,自从我2018年3月入职X高校之后,一直到2019年9月,在这3个学期的时间里面,我讲课的对象全都是大三的同学,而且都是属于专业方向课,比如网络安全、物联网这种。第一学期尽管也教过C++,但是他们毕竟已经是大三第二学期,从心态上来说,他…

2024.7.23(DNS正向解析)

回顾&#xff1a; # 安装 samba yum -y install samba # 自建库&#xff0c;只下载&#xff0c;不安装 yum -y install --downloadonly --downloaddir./soft/ # 配置samba vim /etc/samba/smb.conf # 配置 [xxxxxxxname] commentdasdffsffdslfdjsa path/share …

h5点击电话号跳转手机拨号

需要使用到h5的 <a>标签 我们首先在<head>标签中添加代码 <meta name"format-detection" content"telephoneyes"/>然后再想要的位置添加代码 <a href"tel:10086"> 点击拨打&#xff1a;10086 </a> 这样功能就实现…

海量数据处理(面试)

海量数据 1、从大量的URL中找出相同的URL 解法&#xff1a; 分治法&#xff1a; 如果是单个很大的文件&#xff0c;直接划分文件&#xff0c;按特定大小划分&#xff0c;然后多线程&#xff0c;用map对各个文件进行统计。 如果是两个很大的文件&#xff0c;a和b。通过遍历a…

如何在Linux上安装配置Nexus私有仓库

在Linux上安装和配置Nexus私有仓库需要以下步骤&#xff1a; 下载Nexus Repository Manager&#xff1a; 首先&#xff0c;访问Sonatype Nexus官方网站&#xff08;https://www.sonatype.com/nexus-repository-oss&#xff09;并下载适用于Linux的最新版本的Nexus Repository M…

系统架构设计师教程 第4章 信息安全技术基础知识-4.3 信息安全系统的组成框架4.4 信息加解密技术-解读

系统架构设计师教程 第4章 信息安全技术基础知识-4.3 信息安全系统的组成框架 4.3 信息安全系统的组成框架4.3.1 技术体系4.3.1.1 基础安全设备4.3.1.2 计算机网络安全4.3.1.3 操作系统安全4.3.1.4 数据库安全4.3.1.5 终端安全设备4.3.2 组织机构体系4.3.3 管理体系4.4 信息加…

redis命令超详细

redis数据结构介绍 redis是一个key-value的数据库&#xff0c;key一般是String类型&#xff0c;但是value的类型有很多&#xff1a; 基本类型&#xff1a;String,Hash,List,Set,SortedSet(可排序的不能重复的集合) 特殊类型&#xff1a;GEO,BitMap,HyperLog等 文档官网&…

使用编译器指令将此函数定位在指定地址处

#include <stdio.h> // 使用编译器指令将此函数定位在0x08001000地址处 void my_function() attribute((section(“.ARM.__at_0x08001000”))); void my_function() { printf(“Function located at 0x08001000\n”); } int main() { my_function(); return 0; }

emr部署hive并适配达梦数据库

作者&#xff1a;振鹭 一、达梦 用户、数据库初始化 1、创建hive的元数据库 create tablespace hive_meta datafile /dm8/data/DAMENG/hive_meta.dbf size 100 autoextend on next 1 maxsize 2048;2、创建数据库的用户 create user hive identified by "hive12345&quo…

Android --- 广播

广播是什么&#xff1f; 一种相互通信&#xff0c;传递信息的机制&#xff0c;组件内、进程间&#xff08;App之间&#xff09; 如何使用广播&#xff1f; 组成部分 发送者-发送广播 与启动其他四大组件一样&#xff0c;广播发送也是使用intent发送。 设置action&#xff…

如何在Ubuntu上安装并启动SSH服务(Windows连接)

在日常的开发和管理工作中&#xff0c;通过SSH&#xff08;Secure Shell&#xff09;连接到远程服务器是一个非常常见的需求。如果你在尝试通过SSH连接到你的Ubuntu系统时遇到了问题&#xff0c;可能是因为SSH服务未安装或未正确配置。本文将介绍如何在Ubuntu上安装并启动SSH服…

高效工作流:用Mermaid绘制你的专属流程图;如何在Vue3中导入mermaid绘制流程图

目录 高效工作流&#xff1a;用Mermaid绘制你的专属流程图 一、流程图的使用场景 1.1、流程图flowChart 1.2、使用场景 二、如何使用mermaid画出优雅的流程图 2.1、流程图添加图名 2.2、定义图类型与方向 2.3、节点形状定义 2.3.1、规定语法 2.3.2、不同节点案例 2.…

背包问题模板

2. 01背包问题 - AcWing题库 #include<bits/stdc.h> using namespace std; const int N1010; int f[N]; int v[N],w[N];int main() {int n,m;cin>>n>>m;for(int i1;i<n;i){cin>>v[i]>>w[i];}for(int i1;i<n;i)for(int jm;j>v[i];j--)…