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