mirror of https://github.com/panjf2000/ants.git
opt: leverage binary-search algorithm to speed up PoolWithFunc.purgeStaleWorkers()
This commit is contained in:
parent
7b1e246b0e
commit
3fbd9567c9
|
@ -40,7 +40,7 @@ jobs:
|
|||
uses: golangci/golangci-lint-action@v3
|
||||
with:
|
||||
version: v1.50.1
|
||||
args: -v -E gofumpt -E gocritic -E misspell -E revive -E godot
|
||||
args: --timeout 5m -v -E gofumpt -E gocritic -E misspell -E revive -E godot
|
||||
test:
|
||||
needs: lint
|
||||
strategy:
|
||||
|
|
16
pool_func.go
16
pool_func.go
|
@ -89,17 +89,25 @@ func (p *PoolWithFunc) purgeStaleWorkers(ctx context.Context) {
|
|||
break
|
||||
}
|
||||
|
||||
currentTime := time.Now()
|
||||
criticalTime := time.Now().Add(-p.options.ExpiryDuration)
|
||||
|
||||
p.lock.Lock()
|
||||
idleWorkers := p.workers
|
||||
n := len(idleWorkers)
|
||||
var i int
|
||||
for i = 0; i < n && currentTime.Sub(idleWorkers[i].recycleTime) > p.options.ExpiryDuration; i++ {
|
||||
l, r, mid := 0, n-1, 0
|
||||
for l <= r {
|
||||
mid = (l + r) / 2
|
||||
if criticalTime.Before(idleWorkers[mid].recycleTime) {
|
||||
r = mid - 1
|
||||
} else {
|
||||
l = mid + 1
|
||||
}
|
||||
}
|
||||
i := r + 1
|
||||
expiredWorkers = append(expiredWorkers[:0], idleWorkers[:i]...)
|
||||
if i > 0 {
|
||||
m := copy(idleWorkers, idleWorkers[i:])
|
||||
for i = m; i < n; i++ {
|
||||
for i := m; i < n; i++ {
|
||||
idleWorkers[i] = nil
|
||||
}
|
||||
p.workers = idleWorkers[:m]
|
||||
|
|
Loading…
Reference in New Issue