简介
goroutine协程,是golang的轻量级线程。协程池利用池化技术,复用对象,减少了内存分配的频率以及协程创建开销。
gopool是字节跳动开源节流的gopkg包中协程池的一个实现。
gopool
gopool是字节官方开源的gopkg库提供的协程池实现
demo try
go
gopool.Go(func(){}
// do your job
)
一探究竟

Task
task是链表结构,记录了待执行任务的信息
go
type task struct {
ctx context.Context
f func()
next *task
}
Worker
worker关联了协程池的实例
Pool
Pool定义了协程池的接口
pool是协程池的实现,包含了task的链表结构。
pool通过workerpool和taskpool来创建worker和task实例
核心逻辑
新增执行任务task时,通过taskpool创建task对象。视需创建worker,执行worker的run方法
css
t := taskPool.Get().(*task)
// ...
if () {
p.incWorkerCount()
w := workerPool.Get().(*worker)
w.pool = p
w.run()
}
worker执行时,会获取pool锁,从pool中取出待执行任务,执行任务
scss
go func() {
for {
var t *task
w.pool.taskLock.Lock()
// get task
w.pool.taskLock.Unlock()
// ...
t.f()
}
}
相关配置
pool支持传入ScaleThreshold,当等待任务执行数超过此配置时,创建新的worker
默认实现
defaultPool是pool的默认实现,支持配置容量Cap、panicHandler等
go
func SetCap(cap int32) {
defaultPool.SetCap(cap)
}
func SetPanicHandler(f func(context.Context, interface{})) {
defaultPool.SetPanicHandler(f)
}
总结
pool是gopool的一个逻辑协程池,管理着待执行的task,可以动态创建worker来多协程并发处理task对象。同时,通过sync.pool来优化了task和worker对象的创建。