这会是 Go 中最优雅的协程池吗?

发布于:2024-10-24 编辑:匿名 来源:网络

经常写Go的朋友都知道,Go语言的goruntine对于这种编程语言来说是一个很棒的工具。与线程相比,基于协程的goruntine更加轻量高效,语法也非常简单。

为什么协程比线程更高效?协程和线程是两种不同的并发执行控制结构,它们在很多方面都有显着的不同。首先,从定义上来说,协程是程序级的执行单元,而且是轻量级的。

线程是操作系统级别的并发执行单元,是重量级的。协程的堆栈是动态的,可以根据需要增长和收缩,并且内存使用高效。

线程有自己固定大小的堆栈,堆栈大小限制了线程的数量,并可能导致堆栈溢出错误。协程的创建和切换成本非常低,因为它们是在用户级别进行管理的,不需要系统级别的上下文切换。

线程的创建和切换成本比较高,因为它们是由操作系统管理的,并且涉及到系统级的上下文切换。举个例子,如果你想把钱转到一个人的银行卡账户上,那么协程就像一张电子(在线)银行卡,而线程就像一台ATM机。

如果您使用网银转账,只需动动手指,即可绑定某宝或某信。可以转账,不过去ATM机会比较麻烦,但本质上最终的转账都会通过银行的信息系统完成,只是不同方式的运营成本不同。

协程我们讲完了,但是想要更好的利用协程来处理高并发的任务,并不是一件容易的事情。我们经常了解多线程的概念,那么在实际场景中,到底有多少个多线程呢?多少合适?这是一个值得思考的问题。

为了更好地利用线程,池化的思想慢慢演变。是的,它是一个线程池。

当谈到协程时,这种想法仍然很常见。我们来分享一下这篇文章的要点:Go语言中的优雅使用协程池。

为什么会出现池化理念?池化思想的演变主要源于高效资源利用和系统性能优化的需求。它是一种预先创建并管理资源(如线程、数据库连接等)以实现资源高效利用、降低开销的策略。

降低资源创建和销毁的成本:在多线程编程中,线程的创建和销毁都是资源密集型操作,会消耗大量的时间和系统资源。通过线程池,可以提前创建和维护一组可复用的线程,避免频繁创建和销毁线程的开销。

提高系统响应速度:池化技术通过预先分配资源,无需等待资源创建,使系统在面对任务时能够快速响应。这提高了系统响应能力和吞吐量。

Go优雅的协程池:如果蚂蚁想在项目中更高效的使用goruntine,协程池似乎是必备工具,因为Go语言很简单,自己写一个协程池并不难,但是它作为一个还没有达到顶级水平的Gopher,学习别人优秀的代码是一个需要经历的过程。众所周知,程序员的日常生活只有三件事:学习!学习!还是要多多学习啊!废话不多说,这次分享的蚂蚁是一个非常好用的Go协程池包。

其Github地址:github.com/panjf/ants。使用前需要下载依赖: 代码语言:shell copy go get -u github.com/panjf/ants/v2 然后我们只实现一个功能:counting,即从1到0添加一个名为num的变量。

假设每个操作耗时1ms (1)单线程单线程场景:code 语言:go copy var num int32func addNum(i int32) {atomic.AddInt32(&num, i)time.Sleep(time.Millisecond)fmt.Println ("now num = ", num)}func TestNum(t *testing.T ) {runTimes := 0for i := 0;我 < 运行时间; i++ {addNum(1)}fmt.Printf("result num = %d \n ", num)}看执行时间,居然花了几秒:代码语言:shell copy result num = 0 --- PASS: TestNum (.18s) PASS (2) 初次使用Ants 现在我们启用Ants: 代码语言: go copy func TestAnt(t *testing.T) {defer ants.Release ()var wgsync.WaitGroupsyncCalculateSum := func() {addNum (1)wg.Done()}运行次数:= 0for i := 0; i < 运行时间; i++ {wg.Add(1)_ = ants.Submit(syncCalculateSum) //需要执行的方法}wg.Wait()fmt.Printf("running goroutines: %d\n", ants.Running())fmt.Printf("num = %d \n ", num)} 执行结果仅0.31秒!代码语言:shell复制运行goroutines: num = 0 - -- PASS: TestAnt (0.31s)PASS 但它的缺点是同时使用两个协程,同时使用大量的资源无非是对服务器的一个很大的考验,所以不太好。优雅的。

(3)如果想用Ant优雅地控制协程数量,我们可以使用协程数量有限的协程池。比如设定一个小目标,先使用: 代码语言: go copy func TestAntPool(t *testing.T) {defer ants.Release()var wgsync.WaitGroupf := func() {addNum(1)wg. Done()}runTimes := 0pool, _ := ants.NewPool()for i := 0;我 < 运行时间 ; i++ {wg.Add(1)_ = pool.Submit(f)}wg.Wait()fmt.Printf("正在运行的 goroutine: %d\n", pool.Running())fmt.Printf("num = % d \n ", num)}执行结果仅1.21秒。

虽然时间长了一点,但是优雅多了!代码语言:shell copy running goroutines: num = 0 --- PASS: TestAntPoolAndWithPanicHandler (1.21s) PASS (3) 使用Ants的另一种形式 另外,Ants还支持另一种形式来执行特定的函数: 代码语言:go copy func TestAntWithFunc (t *testing.T) {defer ants.Release()runTimes := 0var wgsync.WaitGroupp, _ := ants.NewPoolWithFunc(10, func(i 接口{}) {addNum(i .(int32))wg.完成()})defer p.Release()for i := 0;我 < 运行时间; i++ {wg.Add(1)_ = p.Invoke(int32(1)) //这个Local参数可以通过结构体传递}wg.Wait()fmt.Printf("running goroutines: %d\n", p .Running())fmt.Printf("完成所有任务,结果为%d\n", num )}此外,Ants还提供了NewMultiPool类来初始化多个协程池。您可以根据预定义的策略从多个协程池中获取工作代码:轮询或最少使用策略。

语言: go copy func TestMultiPool(t *testing.T) { defer ants.Release()runTimes := 0var wgsync.WaitGroupf := func() {addNum(1)wg.Done()}//10表示初始化10协程池,-1位置参数表示协程池容量,当值为-1时表示无限容量 mp, _ := ants.NewMultiPool(10, -1, ants.RoundRobin)defer func() {_ = mp .ReleaseTimeout(5 * time.Second)}()for i := 0;我 < 运行时间; i++ {wg.Add(1)_ = mp.Submit(f)}wg.Wait()fmt.Printf("正在运行的协程: %d\n", mp.Running() )fmt.Printf("完成所有任务, result is %d\n", num)}好了,关于Ants的使用就分享到这里吧~协程池的应用场景 协程池并不是任何时候任何业务都会用到它,它是适用于所有的,而且它也有一些典型应用场景,如: 高并发处理:当系统需要处理大量并发请求时,使用协程池可以有效管理并发任务,避免资源耗尽,提高系统稳定性和性能。资源密集型任务:对于执行时间较长或占用系统资源较多的任务,使用协程池可以控制并发数,避免过多使用系统资源。

任务调度和负载均衡:在需要任务调度和负载均衡的场景中,协程池可以提供有效的任务排队和调度机制,保证任务能够按照预定的策略执行。综上所述,Go语言的协程池在并发编程中发挥着重要作用。

通过合理使用协程池,可以优化系统资源的使用,提高并发性能和吞吐量,简化并发编程的复杂度。

这会是 Go 中最优雅的协程池吗?

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 【24小时创业】2022年8月18日

    【24小时创业】2022年8月18日

    投融资 昨日,国内市场共发生20起投资披露事件,其中先进制造领域7起(启芯半导体、冕冠半导体、启源芯电、新泰半导体、新科集成、星宇空间、每科深思)、汽车交通案例6个(浩一充电、华丰汇众、枫叶出行、猛狮科技、欣旺达EVB、维都科技)、医疗健康案例2个(瑞顺生物、中科

    06-17

  • 信银理财副总裁贺晋:拟设立10亿长三角股权投资基金

    信银理财副总裁贺晋:拟设立10亿长三角股权投资基金

    据投资界(微信ID:pedaily)12月4日消息,昨日,《走进信银理财-温度》信银理财副总裁贺晋在上海召开的《财富行者》媒体发布会上表示,信银理财坚定落实监管要求,稳步推进金融产品转型。 今年信银理财新老产品比例将达到7:3。 可以说,我们的产品转型就在眼前。 ”贺晋介绍

    06-17

  • GeekPwn:电脑管家团队1秒攻破Surface Pro 4,两次夺得世界黑客大赛冠军

    GeekPwn:电脑管家团队1秒攻破Surface Pro 4,两次夺得世界黑客大赛冠军

    5月12日,世界黑客大赛GeekPwn澳门站盛大举行。 腾讯电脑管家网络攻防队一秒破解微软Surface Pro 4,控制Surface摄像头,实现远程监控,成为本次GeekPwn澳门大赛的最大亮点。 腾讯电脑管家网络攻防小组成功攻入Surface Pro 4,将黑客电影中的场景当场变成了真实的现实:通过利

    06-18

  • 第十八届中国中小企业年会正式启动

    第十八届中国中小企业年会正式启动

    9月27日,由中国中小企业商业企业协会联合多家科研单位共同主办的第十八届中国中小企业年会启动仪式和技术机构,举行了。 年会定于11月24日至26日在北京举行。 以“推动企业技术创新,践行中国式现代化”为主题。 任兴磊执行会长在讲话中提到,起点关系大局,起点决定未来。

    06-17

  • 雅高矿业上市,凯雷退出

    雅高矿业上市,凯雷退出

    雅高矿业控股集团是一家集矿业投资与开采、石材加工与销售、石材供应与安装为一体的综合性企业集团。 雅高全产业链整合的战略布局涵盖矿山收购与开采、产品研发与设计、终端渠道建设、销售与售后服务等,实现资源的优化整合。 目前产品已覆盖全球50多个国家。 2019年7月26日

    06-17

  • 新闻 -谐波减速器公司来福谐波已完成6000万元B轮融资,上海金普领投

    新闻 -谐波减速器公司来福谐波已完成6000万元B轮融资,上海金普领投

    据投资界9月7日消息,谐波减速器公司普廷谐波已完成1万元B轮融资。 本轮融资由上海金浦领投,北极光跟投。 本轮融资将主要用于扩大产能以及谐波机电一体化产品的研发。 据悉,今年3月,来福和谐宣布获得由北极光创投领投、乳山资本跟投的数千万元A轮融资。   谐波减速机诞

    06-17

  • 从品酒神器到大学生礼包,看阿里云如何贴近地面飞行

    从品酒神器到大学生礼包,看阿里云如何贴近地面飞行

    作者 |胡海杰崇高的云服务与你我有何关系?日前在北京举行的阿里云峰会上,两款本土产品应用让人印象深刻,分别是一款品酒神器和一款助力大学生在线开发实践的云服务。 阿里巴巴集团副总裁华先胜在推广酒品鉴赏盒产品时表示,它可以通过图像识别、称重、光学扫描等方式识别茅

    06-18

  • 我们想象的AI可能已经过时了

    我们想象的AI可能已经过时了

    今年,AI在绘画上行动起来。 有人欢呼:可以给关键词画图的AI模型,让创作成本接近于零;还有人感叹:在强大的人工智能面前,人类独特的能力正在一一丧失。 当然,也有人感到恐慌:一些图书馆宣布不接受人工智能生成的作品存储,一些画家和漫画家发表反对人工智能模型绘画的声

    06-18

  • 圣茂焊锡材料(苏州)有限公司将于

    圣茂焊锡材料(苏州)有限公司将于

    三月中国电子展推出新款锡膏和助焊剂 - 圣茂焊锡材料(苏州)有限公司很高兴地宣布将参加慕尼黑电子展中国展。 将于3月20日至22日在上海新国际博览中心隆重举行。 公司将展示PQ10系列低温锡膏、适用于汽车电子的新型P系列锡膏、PW水溶性锡膏、SMF-WC53水溶性植球助焊剂及BGA锡

    06-06

  • 无人机器人公司“Insidenoid Robotics”获1500万美元A轮融资,Pitango领投

    无人机器人公司“Insidenoid Robotics”获1500万美元A轮融资,Pitango领投

    6月16日消息:据Finsmes报道,无人机器人公司Insidenoid Robotics近日获得1万美元A轮融资。 本轮融资由Pitango领投,Target Global、欧洲创新理事会基金和Spider Capital跟投。 据了解,本轮融资将用于投资全力生产并制定其GTM(进入市场)战略。 该公司最近还推出了Tando?室

    06-18

  • 山东威达拟出资1.99亿元设立产业基金

    山东威达拟出资1.99亿元设立产业基金

    山东威达(26日)4月12日晚间发布公告:为实现产业运营与资本运营良性互动,公司拟作为有限合伙人与北京富唐航空投资管理有限公司合作共同发起设立广西南宁航县鑫达产业基金合伙企业(有限合伙),双方于4月10日签署了相关《合伙协议》。 据悉该基金认缴出资总额为2亿元人民币

    06-18

  • 芬香消客获中软国际近亿元融资

    芬香消客获中软国际近亿元融资

    据5月25日消息,CRM SaaS初创公司“芬香消客”宣布获得中软国际近亿元战略投资。

    06-18