为什么Go搞了协程GoFrame还要搞协程池?怎么用?什么时候用?

网站建设4年前发布
40 0 0

最近收到「程序员升级打怪」知识星球[1]的提问:“go协程本来就是轻量级线程,还有必要做复用增加工作量吗,性能可以提升多少呢?”,Pool: goroutine池,用于管理若干可复用的goroutine协程资源,Worker: 池对象中参与任务执行的goroutine,一个worker可以执行若干个job,直到队列中再无等待的job,Job:添加到池对象的任务队列中等待执行的任务,是一个func()方法,一个job同时只能被一个worker获取并执行。,使用默认的协程池,限制100个协程执行1000个任务,pool.Size() 获得当前工作的协程数量,pool.Jobs() 获得当前池中待处理的任务数量,20230306135657e6973a4503a89441733893e875e91ca2252a41504,是不是灰常简单~,一个简单的场景,请使用协程打印0~9。,大家看下面的代码有没有问题,请预测一下打印结果。,不用着急看答案,.,.,.,猜一下打印结果是什么。,20230306135657b12e7dc889f26887475929c906cdd56cd46dc0676,对于异步线程/协程来讲,函数进行异步执行注册时,该函数并未真正开始执行。,(注册时只在goroutine​的栈中保存了变量i的内存地址),而一旦开始执行时函数才会去读取变量i​的值,而这个时候变量i​的值已经自增到了9。,20230306135658e563a4e60bd57ad1d14514d97c3ee34f1dc329924,使用grpool和使用go一样,都需要把当前变量i的值赋值给一个不会改变的临时变量,在函数中使用该临时变量而不是直接使用变量i。,打印结果,20230306135658d5f8d7a296a06ae0649387c339939441db7eb3392,注意:这是错误的演示,不要这么写~,打印结果,20230306135713e389cb8024fd0168ad6964222ca0c0a9d8e949700,使用for循环,开启一万个协程,分别使用原生goroutine和grpool执行。,看两者在内存占用和耗时方面的差别。,性能测试结果分析,通过测试结果我们能很明显的看出来,在相同的环境下执行相同的任务:,grpool相比于goroutine,内存占用更少,耗时更长;,goroutine相比于grpool占用内存更高,耗时更短。,我们再来回顾一下开篇的结论,相信通过仔细阅读,你一定有了更好的理解:,参考资料,[1]「程序员升级打怪」知识星球: https://wx.zsxq.com/dweb2/index/group/15528828844882,欢迎Star GoFrame:https://github.com/gogf/gf,本文转载自微信公众号「 程序员升级打怪之旅」,作者「王中阳Go」,可以通过以下二维码关注。,2023030613565975ed01465d38b38edce164643373449925ad0d922,转载本文请联系「 程序员升级打怪之旅」公众号。

© 版权声明

相关文章