从零学习 Go 语言(33):如何实现一个协程池?
在 Golang 中要创建一个协程是一件无比简单的事情,你只要定义一个函数,并使用 go 关键字去执行它就行了。
如果你接触过其他语言,会发现你在使用使用线程时,为了减少线程频繁创建销毁还来的开销,通常我们会使用线程池来复用线程。
池化技术就是利用复用来提升性能的,那在 Golang 中需要协程池吗?
在 Golang 中,goroutine 是一个轻量级的线程,他的创建、调度都是在用户态进行,并不需要进入内核,这意味着创建销毁协程带来的开销是非常小的。
因此,我认为大多数情况下,开发人员是不太需要使用协程池的。
但也不排除有某些场景下是需要这样做,因为我还没有遇到就不说了。
抛开是否必要这个问题,单纯从技术的角度来看,我们可以怎样实现一个通用的协程池呢?
下面就来一起学习一下我的写法
首先定义一个协程池(Pool)结构体,包含两个属性,都是 chan 类型的。
一个是 work,用于接收 task 任务
一个是 sem,用于设置协程池大小,即可同时执行的协程数量
type Pool struct {
work chan func() // 任务
sem chan struct{} // 数量
}
相关文章