实现了简单的worker池,可以执行一些后台常驻类的任务,并且可以实现worker数量的实时控制。
利用两个worker数组,alive和idle,分别保存活跃的worker和空闲的worker,并且空闲的worker可以从暂停状态快速转变为活跃状态。由于每次在增加worker数量的时候没有创建goroutine的情况,所以效率会稍微高一些。
type taskFunc func() error
type workerManager struct {
alive []*worker
idle []*worker
lck *sync.Mutex
count int
NewWorker func(int) *worker
MaxAlive int
MaxIdle int
}
func (m *workerManager) SetWorkerNum(num int) (err error) {
if num > m.MaxAlive {
err = errors.New("worker num can not bigger than MaxAlive")
return
}
m.lck.Lock()
defer m.lck.Unlock()
if len(m.alive) == num {
return
}
//新增活跃的worker
if len(m.alive) < num {
need := num - len(m.alive)
for ; need > 0 && len(m.idle) > 0; need-- {
m.setAlive(m.idle[len(m.idle)-1])
m.delIdle(1)
}
for ; need > 0; need-- {
m.count++
w := m.NewWorker(m.coun