Skip to content

Commit ca3320f

Browse files
authored
Merge pull request #19 from devchat-ai/bugfix
Fix cond issue and workerStack index order issue
2 parents 71c44d1 + 204639c commit ca3320f

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

gopool.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package gopool
22

33
import (
44
"context"
5+
"sort"
56
"sync"
67
"time"
78
)
@@ -153,26 +154,38 @@ func (p *goPool) adjustWorkers() {
153154
ticker := time.NewTicker(p.adjustInterval)
154155
defer ticker.Stop()
155156

157+
var adjustFlag bool
158+
156159
for {
160+
adjustFlag = false
157161
select {
158162
case <-ticker.C:
159163
p.cond.L.Lock()
160164
if len(p.taskQueue) > len(p.workers)*3/4 && len(p.workers) < p.maxWorkers {
165+
adjustFlag = true
161166
// Double the number of workers until it reaches the maximum
162167
newWorkers := min(len(p.workers)*2, p.maxWorkers) - len(p.workers)
163168
for i := 0; i < newWorkers; i++ {
164169
worker := newWorker()
165170
p.workers = append(p.workers, worker)
171+
// Don't use len(p.workerStack)-1 here, because it will be less than len(p.workers)-1 when the pool is busy
166172
p.workerStack = append(p.workerStack, len(p.workers)-1)
167173
worker.start(p, len(p.workers)-1)
168174
}
169-
} else if len(p.taskQueue) == 0 && len(p.workers) > p.minWorkers {
175+
} else if len(p.taskQueue) == 0 && len(p.workerStack) == len(p.workers) && len(p.workers) > p.minWorkers {
176+
adjustFlag = true
170177
// Halve the number of workers until it reaches the minimum
171178
removeWorkers := (len(p.workers) - p.minWorkers + 1) / 2
179+
// Sort the workerStack before removing workers.
180+
// [1,2,3,4,5] -working-> [1,2,3] -expansive-> [1,2,3,6,7] -idle-> [1,2,3,6,7,4,5]
181+
sort.Ints(p.workerStack)
172182
p.workers = p.workers[:len(p.workers)-removeWorkers]
173183
p.workerStack = p.workerStack[:len(p.workerStack)-removeWorkers]
174184
}
175185
p.cond.L.Unlock()
186+
if adjustFlag {
187+
p.cond.Broadcast()
188+
}
176189
case <-p.ctx.Done():
177190
return
178191
}

gopool_benchmark_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import (
55
"testing"
66
"time"
77

8-
"github.com/daniel-hutao/spinlock"
98
"github.com/alitto/pond"
9+
"github.com/daniel-hutao/spinlock"
1010
"github.com/panjf2000/ants/v2"
1111
)
1212

0 commit comments

Comments
 (0)