🐲 An optimization in worker channel

This commit is contained in:
Andy Pan 2019-01-26 14:32:12 +08:00
parent c829c6f622
commit b091435432
3 changed files with 27 additions and 11 deletions

32
ants.go
View File

@ -25,6 +25,7 @@ package ants
import (
"errors"
"math"
"runtime"
)
const (
@ -35,6 +36,30 @@ const (
DefaultCleanIntervalTime = 5
)
var (
// Error types for the Ants API.
ErrInvalidPoolSize = errors.New("invalid size for pool")
ErrInvalidPoolExpiry = errors.New("invalid expiry for pool")
ErrPoolClosed = errors.New("this pool has been closed")
// workerChanCap determines whether the channel of a worker should be a buffered channel
// to get the best performance, inspired by fasthttp.
// https://github.com/valyala/fasthttp/blob/master/workerpool.go#L139
workerChanCap = func() int {
// Use blocking workerChan if GOMAXPROCS=1.
// This immediately switches Serve to WorkerFunc, which results
// in higher performance (under go1.5 at least).
if runtime.GOMAXPROCS(0) == 1 {
return 0
}
// Use non-blocking workerChan if GOMAXPROCS>1,
// since otherwise the Serve caller (Acceptor) may lag accepting
// new connections if WorkerFunc is CPU-bound.
return 1
}()
)
// Init a instance pool when importing ants.
var defaultAntsPool, _ = NewPool(DefaultAntsPoolSize)
@ -62,10 +87,3 @@ func Free() int {
func Release() {
defaultAntsPool.Release()
}
// Error types for the Ants API.
var (
ErrInvalidPoolSize = errors.New("invalid size for pool")
ErrInvalidPoolExpiry = errors.New("invalid expiry for pool")
ErrPoolClosed = errors.New("this pool has been closed")
)

View File

@ -28,8 +28,6 @@ import (
"time"
)
type sig struct{}
type f func()
// Pool accept the tasks from client,it limits the total
@ -222,7 +220,7 @@ func (p *Pool) getWorker() *Worker {
} else if w == nil {
w = &Worker{
pool: p,
task: make(chan f, 1),
task: make(chan f, workerChanCap),
}
w.run()
p.incRunning()

View File

@ -224,7 +224,7 @@ func (p *PoolWithFunc) getWorker() *WorkerWithFunc {
} else if w == nil {
w = &WorkerWithFunc{
pool: p,
args: make(chan interface{}, 1),
args: make(chan interface{}, workerChanCap),
}
w.run()
p.incRunning()