You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
naza/pkg/taskpool/pool.go

64 lines
1.3 KiB
Go

// Copyright 2019, Chef. All rights reserved.
// https://github.com/q191201771/naza
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package taskpool
import (
"sync"
"github.com/q191201771/naza/pkg/nazaatomic"
)
type pool struct {
idleWorkerNum nazaatomic.Uint32
busyWorkerNum nazaatomic.Uint32
m sync.Mutex
idleWorkerList []*Worker
}
func (p *pool) Go(task Task) {
var w *Worker
p.m.Lock()
if len(p.idleWorkerList) != 0 {
w = p.idleWorkerList[len(p.idleWorkerList)-1]
p.idleWorkerList = p.idleWorkerList[0 : len(p.idleWorkerList)-1]
p.idleWorkerNum.Decrement()
p.busyWorkerNum.Increment()
}
p.m.Unlock()
if w == nil {
w = NewWorker(p)
w.Start()
p.busyWorkerNum.Increment()
}
w.Go(task)
}
func (p *pool) KillIdleWorkers() {
p.m.Lock()
for i := range p.idleWorkerList {
p.idleWorkerList[i].Stop()
}
p.idleWorkerNum.Sub(uint32(len(p.idleWorkerList)))
p.idleWorkerList = p.idleWorkerList[0:0]
p.m.Unlock()
}
func (p *pool) Status() (idleWorkerNum int, busyWorkerNum int) {
return int(p.idleWorkerNum.Load()), int(p.busyWorkerNum.Load())
}
func (p *pool) markIdle(w *Worker) {
p.m.Lock()
p.idleWorkerNum.Increment()
p.busyWorkerNum.Decrement()
p.idleWorkerList = append(p.idleWorkerList, w)
p.m.Unlock()
}