Go 语言系列34:协程池
在其他语言中,为了减少线程频繁创建销毁带来的开销,通常我们会使用线程池来复用线程。在 Go 中, goroutine
是一个轻量级的线程,他的创建、调度都是在用户态进行,并不需要进入内核,这意味着创建销毁协程带来的开销是非常小的。因此,在大多数情况下是不太需要使用协程池的。但这一期我们还是讲一讲协程池,说不定哪天要用上了呢?
创建协程池结构体
第一步,我们定义一个 协程池(Pool) 结构体,其中包含两个属性。
创建协程池对象函数
定义一个 New
函数,用于创建一个协程池对象。
执行任务函数
绑定一个执行任务的函数 worker
,这里使用了 for
无限循环,使协程在执行完任务后,也不退出,而是一直在接收新的任务。
添加任务函数
绑定一个往协程池中添加任务的函数 NewTask
。第一次调用 NewTask
添加任务的时候,由于 work
是无缓冲通道,所以会一定会走第二个 case
的分支:使用 go worker
开启一个协程。
协程池的使用
下面是一个协程池的例子:
当然,这一期讲的也只是一个最最简单的实现,如果要了解更多关于协程池的知识,还请自行上网查阅相关资料。
参考文献:
[1] Alan A. A. Donovan; Brian W. Kernighan, Go 程序设计语言, Translated by 李道兵, 高博, 庞向才, 金鑫鑫 and 林齐斌, 机械工业出版社, 2017.
[2] https://mp.weixin.qq.com/s?__biz=MzAxMTA4Njc0OQ==&mid=2651439736&idx=5&sn=c7fc9e7f1315ed4d1a0aacc4a462d017&scene=19#wechat_redirect