初始化一个 Goroutine Pool 池,这个Pool维护了一个类似栈的FILO队列 ,里面存放负责处理任务的Worker,然后每有一个请求就开启一个协程。
之后
- 检查当前Worker队列中是否有空闲的Worker,如果有,取出执行当前的task;
- 没有空闲Worker,判断当前在运行的Worker是否已超过该Pool的容量,是 — 阻塞等待直至有Worker被放回Pool;否 — 新开一个Worker(goroutine)处理;
- 每个Worker执行完任务之后,放回Pool的队列中等待。
参考资料:《Go语言实战》7.2章 Pool
package main
import (
"io"
"log"
"sync"
"errors"
)
// Pool管理一组可以安全在多个goroutine间共享的资源
// 被管理的资源必须实现io.Closer接口
type Pool struct {
m sync.Mutex
resources chan io.Closer
factory func() (io.Closer, error)
closed bool
}
// ErrPoolClosed表示请求了一个已经关闭的池
var ErrPoolClosed = errors.New("Pool has been closed.")
//New创建一个用来管理资源的池
func New(fn func