package taskpool: worker list -> slice

pull/2/head
q191201771 5 years ago
parent a29ed02c89
commit 931637f641

@ -8,7 +8,7 @@ import (
)
var (
taskNum = 1000 * 10000
taskNum = 1000 * 1000
initWorkerNum = 1 //1000 * 20 //1000 * 10
)
@ -29,10 +29,11 @@ func originGo() {
}
func taskPool() {
var poolNum = 1
nazalog.Debug("> BenchmarkTaskPool")
var wg sync.WaitGroup
var ps []taskpool.Pool
var poolNum = 1
for i := 0; i < poolNum; i++ {
p, _ := taskpool.NewPool(func(option *taskpool.Option) {
option.InitWorkerNum = initWorkerNum
@ -58,6 +59,8 @@ func taskPool() {
//nazalog.Debugf("killed, worker num. idle=%d, busy=%d", idle, busy)
}
nazalog.Debug("< BenchmarkTaskPool")
idle, busy := ps[0].Status()
nazalog.Debugf("killed, worker num. idle=%d, busy=%d", idle, busy)
}
func main() {

@ -13,7 +13,6 @@
package taskpool
import (
"container/list"
"errors"
"sync/atomic"
)
@ -55,11 +54,12 @@ func NewPool(modOptions ...ModOption) (Pool, error) {
}
var p pool
p.idleWorkerList = list.New()
//p.idleWorkerList = list.New()
for i := 0; i < option.InitWorkerNum; i++ {
w := NewWorker(&p)
w.Start()
p.idleWorkerList.PushBack(w)
//p.idleWorkerList.PushBack(w)
p.idleWorkerList = append(p.idleWorkerList, w)
}
atomic.AddInt32(&p.idleWorkerNum, int32(option.InitWorkerNum))
return &p, nil

@ -9,7 +9,6 @@
package taskpool
import (
"container/list"
"sync"
"sync/atomic"
)
@ -20,16 +19,20 @@ type pool struct {
//m SpinLock
m sync.Mutex
idleWorkerList *list.List
//idleWorkerList *list.List
idleWorkerList []*Worker
}
func (p *pool) Go(task Task) {
var w *Worker
p.m.Lock()
e := p.idleWorkerList.Front()
if e != nil {
w = e.Value.(*Worker)
p.idleWorkerList.Remove(e)
//e := p.idleWorkerList.Front()
//if e != nil {
// w = e.Value.(*Worker)
// p.idleWorkerList.Remove(e)
if len(p.idleWorkerList) != 0 {
w = p.idleWorkerList[0]
p.idleWorkerList = p.idleWorkerList[1:]
atomic.AddInt32(&p.idleWorkerNum, -1)
atomic.AddInt32(&p.busyWorkerNum, 1)
}
@ -44,15 +47,20 @@ func (p *pool) Go(task Task) {
func (p *pool) KillIdleWorkers() {
p.m.Lock()
n := p.idleWorkerList.Len()
var next *list.Element
for e := p.idleWorkerList.Front(); e != nil; e = next {
w := e.Value.(*Worker)
w.Stop()
next = e.Next()
p.idleWorkerList.Remove(e)
for i := range p.idleWorkerList {
p.idleWorkerList[i].Stop()
}
atomic.AddInt32(&p.idleWorkerNum, int32(-n))
atomic.AddInt32(&p.idleWorkerNum, int32(-len(p.idleWorkerList)))
p.idleWorkerList = p.idleWorkerList[0:0]
//n := p.idleWorkerList.Len()
//var next *list.Element
//for e := p.idleWorkerList.Front(); e != nil; e = next {
// w := e.Value.(*Worker)
// w.Stop()
// next = e.Next()
// p.idleWorkerList.Remove(e)
//}
//atomic.AddInt32(&p.idleWorkerNum, int32(-n))
p.m.Unlock()
}
@ -66,6 +74,7 @@ func (p *pool) markIdle(w *Worker) {
p.m.Lock()
atomic.AddInt32(&p.idleWorkerNum, 1)
atomic.AddInt32(&p.busyWorkerNum, -1)
p.idleWorkerList.PushBack(w)
p.idleWorkerList = append(p.idleWorkerList, w)
//p.idleWorkerList.PushBack(w)
p.m.Unlock()
}

Loading…
Cancel
Save