package taskpool: worker list -> slice

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

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

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

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

Loading…
Cancel
Save