golang线程池ants-四种使用方法
目录
1、ants介绍
2、使用方式汇总
3、各种使用方式详解
3.1 默认池
3.2 普通模式
3.3 带参函数
3.4 多池多协程
4、总结
1、ants介绍
众所周知,goroutine相比于线程来说,更加轻量、资源占用更少、无线程上下文切换等优势,但是也不能无节制的创建使用,如果系统中开启的goroutine过多而没有及时回收,也会造成系统内存资源耗尽。
ants是一款高性能的协程管理池,实现了协程的创建、缓存、复用、刷新、停止能功能,同时允许开发者设置线程池中worker的数量、线程池本身的个数以及workder中的任务,从而实现更加高效的运行效果。
github:GitHub - panjf2000/ants: 🐜🐜🐜 ants is a high-performance and low-cost goroutine pool in Go./ ants 是一个高性能且低损耗的 goroutine 池。
2、使用方式汇总
ants的使用有四种方式,分别如下:
这四种使用方式,前两种最常用,基本能满足日常系统的开发需要,第四种默认池,简单的场景也可以用,但不推荐,多池的情况还没想到特别合适的应用场景。
3、各种使用方式详解
3.1 默认池
ants在启动时,会默认初始化一个协程池,这部分代码位于ants.go文件中:
var (// ErrLackPoolFunc will be returned when invokers don't provide function for pool.ErrLackPoolFunc = errors.New("must provide function for pool")// ErrInvalidPoolExpiry will be returned when setting a negative number as the periodic duration to purge goroutines.ErrInvalidPoolExpiry = errors.New("invalid expiry for pool")// ErrPoolClosed will be returned when submitting task to a closed pool.ErrPoolClosed = errors.New("this pool has been closed")// ErrPoolOverload will be returned when the pool is full and no workers available.ErrPoolOverload = errors.New("too many goroutines blocked on submit or Nonblocking is set")// ErrInvalidPreAllocSize will be returned when trying to set up a negative capacity under PreAlloc mode.ErrInvalidPreAllocSize = errors.New("can not set up a negative capacity under PreAlloc mode")// ErrTimeout will be returned after the operations timed out.ErrTimeout = errors.New("operation timed out")// ErrInvalidPoolIndex will be returned when trying to retrieve a pool with an invalid index.ErrInvalidPoolIndex = errors.New("invalid pool index")// ErrInvalidLoadBalancingStrategy will be returned when trying to create a MultiPool with an invalid load-balancing strategy.ErrInvalidLoadBalancingStrategy = errors.New("invalid load-balancing strategy")// workerChanCap determines whether the channel of a worker should be a buffered channel// to get the best performance. Inspired by fasthttp at// https://github.com/valyala/fasthttp/blob/master/workerpool.go#L139workerChanCap = func() int {// Use blocking channel if GOMAXPROCS=1.// This switches context from sender to receiver immediately,// which results in higher performance (under go1.5 at least).if runtime.GOMAXPROCS(0) == 1 {return 0}// Use non-blocking workerChan if GOMAXPROCS>1,// since otherwise the sender might be dragged down if the receiver is CPU-bound.return 1}()// log.Lmsgprefix is not available in go1.13, just make an identical value for it.logLmsgprefix = 64defaultLogger = Logger(log.New(os.Stderr, "[ants]: ", log.LstdFlags|logLmsgprefix|log.Lmicroseconds))// Init an instance pool when importing ants.defaultAntsPool, _ = NewPool(DefaultAntsPoolSize)
)
使用起来就比较简单了,直接往池子里提交任务即可。
package mainimport ("fmt""sync""time""github.com/panjf2000/ants/v2"
)func add(d int) {sum := 0for i := 0; i < d; i++ {sum += i}
}
func main() {var wg sync.WaitGroupnow := time.Now()for i := 0; i < 5; i++ {wg.Add(1)ants.Submit(func() {add(10000000000)wg.Done()})}wg.Wait()fmt.Println(time.Since(now))now = time.Now()for i := 0; i < 5; i++ {add(10000000000)}fmt.Println(time.Since(now))
}
运行结果:
3.2 普通模式
普通模式和使用默认池非常类似,但是需要自己创建一个线程池:
p, _ := ants.NewPool(5)
函数参数为协程池协程个数,测试代码如下:
package mainimport ("fmt""sync""time""github.com/panjf2000/ants/v2"
)func add(d int) {sum := 0for i := 0; i < d; i++ {sum += i}
}
func main() {var wg sync.WaitGroupnow := time.Now()p, _ := ants.NewPool(5)for i := 0; i < 5; i++ {wg.Add(1)p.Submit(func() {add(10000000000)wg.Done()})}wg.Wait()fmt.Println("协程池运行:", time.Since(now))now = time.Now()for i := 0; i < 5; i++ {add(10000000000)}fmt.Println("循环运行:", time.Since(now))
}
3.3 带参函数
带参函数,重点是往worker中传递函数执行的参数,每个workder中都是同一个执行函数。
package mainimport ("fmt""sync""time""github.com/panjf2000/ants/v2"
)func add(d int) {sum := 0for i := 0; i < d; i++ {sum += i}fmt.Println("the sum is: ", sum)
}
func main() {var wg sync.WaitGroupnow := time.Now()p, _ := ants.NewPoolWithFunc(5, func(i interface{}) {add(i.(int))wg.Done()})for i := 0; i < 5; i++ {wg.Add(1)p.Invoke(1000000000)}wg.Wait()fmt.Println("循环运行:", time.Since(now))
}
运行结果:
liupeng@liupengdeMacBook-Pro ants_study % go run thread_default.go
the sum is: 499999999500000000
the sum is: 499999999500000000
the sum is: 499999999500000000
the sum is: 499999999500000000
the sum is: 499999999500000000
循环运行: 352.447333ms
3.4 多池多协程
这种模式,就是声明了多个协程池,每个池子里有多个协程在跑。
package mainimport ("fmt""sync""time""github.com/panjf2000/ants/v2"
)func add(d int) {sum := 0for i := 0; i < d; i++ {sum += i}fmt.Println("the sum is: ", sum)
}
func main() {var wg sync.WaitGrouprunTimes := 20now := time.Now()mpf, _ := ants.NewMultiPoolWithFunc(10, runTimes/10, func(i interface{}) {add(i.(int))wg.Done()}, ants.LeastTasks)for i := 0; i < runTimes; i++ {wg.Add(1)mpf.Invoke(1000000000)}wg.Wait()fmt.Println("循环运行:", time.Since(now))
}
运行记录:
4、总结
以上就是ants协程池所有的使用方式,3.2、3.3章节介绍的两种方式比较常用,也是推荐的使用方式,使用协程池,可以有效的控制系统硬件资源的使用,防止机器被打满,对于高并发服务非常推荐使用。
后面会学习一下ants的源码,并整理成文档发出来,欢迎围观。
相关文章:

golang线程池ants-四种使用方法
目录 1、ants介绍 2、使用方式汇总 3、各种使用方式详解 3.1 默认池 3.2 普通模式 3.3 带参函数 3.4 多池多协程 4、总结 1、ants介绍 众所周知,goroutine相比于线程来说,更加轻量、资源占用更少、无线程上下文切换等优势,但是也不能…...

Flutter开发效率提升1000%,Flutter Quick教程之对组件进行拖拽与接收
1,首先,所有可以选择的组件,都在左边的组件面板里。从里面点击任何一个,按住左键,向右边的手机面板上进行拖拽即可。 2,拖拽后,我们要选择一个接收组件。什么时候可以接收组件,就是当…...

揭秘小程序商城的团购奇迹:独特模式引领盈利新纪元
在数字经济的新纪元里,你是否对那些不张扬却充满潜力的商业模式心生好奇?今天,我要为你揭示一种别出心裁的商业模式,它以其独特的魅力,不仅迅速吸引了大量用户的目光,更在短短一个月内创造了超过600万的惊人…...

ssm_mysql_高校自习室预约系统(源码)
博主介绍:✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

AI自动化办公:批量将Excel表格英文内容翻译为中文
有一个50列的表格,里面都是英文,要翻译成中文: 在ChatGPT中输入提示词: 你是一个开发AI大模型应用的Python编程专家,要完成以下任务的Python脚本: 打开Excel文件:"F:\AI自媒体内容\AI行业…...

PPT 隐藏开启对象图层
目录预览 一、问题描述二、解决方案三、参考链接 一、问题描述 制作PPT的时候,有时候需要在一张PPT放置多个依次出现的内容,然后设置对应的动画,要是需要对某个内容进行修改的话,就会很不方便,这个时候就需要使用&…...

PHP火狼大灌篮游戏源码微信+手机wap源码带控制
使用此接口可以实现支付宝、QQ钱包、微信支付与财付通的即时到账,免签约,无需企业认证。PHP易支付源码,免签约不需要企业的支付平台源码,彩虹第三四方在线支付系统源码,易支付token合作者商户申请源码,app和网页都可以…...
推荐几首听无数遍也听不腻的好歌(1)
1.Wannabe (Spice Girls Cover) 这首歌是Why Mona创作的首红眼特效的歌,唱的像牙痛的唱不清楚,但配上超级劲爆的旋律及节奏,简直好听到爆 2.Down For Life (Reset) 这首HSHK创作的纯音乐,虽然旋律一直重复一个调,但…...

【全开源】Java短剧系统微信小程序+H5+微信公众号+APP 源码
打造属于你的精彩短视频平台 一、引言:为何选择短剧系统小程序? 在当今数字化时代,短视频已经成为人们日常生活中不可或缺的一部分。而短剧系统小程序源码,作为构建短视频平台的强大工具,为广大开发者提供了快速搭建…...

基于Springboot驾校预约平台小程序的设计与实现(源码+数据库+文档)
一.项目介绍 系统角色:管理员、教练、学员 小程序(仅限于学员注册、登录): 查看管理员发布的公告信息 查看管理员发布的驾校信息 查看所有教练信息、预约(需教练审核)、评论、收藏喜欢的教练 查看管理员发布的考试信息、预约考试(需管理…...
python列表基本运算
列表基本运算 成员运算符 in 老师你在上课喊人回答问题的时候,就犯了难。想点的人名字已经脱口而出了,但发现这位同学没来。 可不,今天的课就来了 8 个人: students [林黛玉, 薛宝钗, 贾元春, 妙玉, 贾惜春, 王熙凤, 秦可卿,…...
Pytorch实用教程:pytorch中nn.Linear()用法详解 | 构建多层感知机 | nn.Module的作用 | nn.Sequential的作用
文章目录 1. nn.Linear()用法构造函数参数示例使用场景2. 构建多层感知机步骤代码示例注意事项3. 继承自nn.Module的作用是什么?1. 组织网络结构2. 参数管理3. 模型保存和加载4. 设备管理不继承 `nn.Module` 的后果...
如何利用unicloud阿里云云函数实现文件包括图片或文件上传,unicloud云函数写法一览
这里以一个单文件上传为例子,多图多文件同理,循环单图处理逻辑即可。 背景 前端vue上传图片文件(base64格式)到服务器,并获取返回的服务器资源存储路径 传入参数 { ”queryStringParameters“:{ "file":&qu…...

Django序列化器中is_valid和validate
今天上班的时候分配了一个任务,是修复前端的一个提示优化,如下图所示: 按照以往的经验我以为可以直接在validate上进行校验,如何抛出一个异常即可 ,例如: class CcmSerializer(serializers.ModelSerialize…...

关于Golang中自定义包的简单使用-Go Mod
1. go env 查看 GO111MODULE 是否为 on,不是修改成on go env -w GO111MODULEon 2 .自定义包的目录格式 3. test.go 内容 package calc func Add(x, y int) int { // 首字母大写表示公有方法return x y }func Sub(x, y int) int {return x - y } 4.生成calc目…...

Dijkstra求最短路篇二(全网最详细讲解两种方法,适合小白)(python,其他语言也适用)
前言: Dijkstra算法博客讲解分为两篇讲解,这两篇博客对所有有难点的问题都会讲解,小白也能很好理解。看完这两篇博客后保证收获满满。 第一篇博客讲解朴素Dijkstra算法Dijkstra求最短路篇一(全网最详细讲解两种方法,适合小白)(p…...

Dijkstra求最短路篇一(全网最详细讲解两种方法,适合小白)(python,其他语言也适用)
前言: Dijkstra算法博客讲解分为两篇讲解,这两篇博客对所有有难点的问题都会讲解,小白也能很好理解。看完这两篇博客后保证收获满满。 本篇博客讲解朴素Dijkstra算法,第二篇博客讲解堆优化Dijkstra算法Dijkstra求最短路篇二(全网…...
计算机组成原理06:浮点数运算
浮点数加减运算 之前我们提到过,浮点数具有特定的表示形式。因此,在进行浮点数的加减运算之前,需要统一浮点数的表达方式。这里我们主要对浮点数表示中的尾数M进行处理,要求0≤M<1,统一格式如下: 正数…...

opencascade 快速显示AIS_ConnectedInteractive源码学习
AIS_ConcentricRelation typedef PrsDim_ConcentricRelation AIS_ConcentricRelation AIS_ConnectedInteractive 简介 创建一个任意位置的另一个交互对象实例作为参考。这允许您使用连接的交互对象,而无需重新计算其表示、选择或图形结构。这些属性是从您的参考对…...
CentOS系统上安装单机版Redis教程
一、前言 1.1 为什么选择Redis? Redis不仅支持丰富的数据类型(如字符串、哈希、列表、集合、有序集合等),还具有高性能、持久化、发布订阅、事务和Lua脚本等特点。这些优势使其成为分布式系统和高并发应用中的首选。 1.2 为什么…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...
如何通过git命令查看项目连接的仓库地址?
要通过 Git 命令查看项目连接的仓库地址,您可以使用以下几种方法: 1. 查看所有远程仓库地址 使用 git remote -v 命令,它会显示项目中配置的所有远程仓库及其对应的 URL: git remote -v输出示例: origin https://…...