给 GPT 的 Prompts
User
gopool.go
// adjustWorkers adjusts the number of workers according to the number of tasks in the queue. func (p *goPool) adjustWorkers() { ticker := time.NewTicker(p.adjustInterval) defer ticker.Stop()for range ticker.C {
p.cond.L.Lock()
if len(p.taskQueue) > (p.maxWorkers-p.minWorkers)/2+p.minWorkers && len(p.workerStack) < p.maxWorkers {
// Double the number of workers until it reaches the maximum
newWorkers := min(len(p.workerStack)*2, p.maxWorkers) - len(p.workerStack)
for i := 0; i < newWorkers; i++ {
worker := newWorker()
p.workers = append(p.workers, worker)
p.workerStack = append(p.workerStack, len(p.workers)-1)
worker.start(p, len(p.workers)-1)
}
} else if len(p.taskQueue) < p.minWorkers && len(p.workerStack) > p.minWorkers {
// Halve the number of workers until it reaches the minimum
removeWorkers := max((len(p.workerStack)-p.minWorkers)/2, p.minWorkers)
p.workers = p.workers[:len(p.workers)-removeWorkers]
p.workerStack = p.workerStack[:len(p.workerStack)-removeWorkers]
}
p.cond.L.Unlock()
}
}
我发现这个workers调整的逻辑不太对。这里没有考虑到当前workerStack的大小和taskQueue的关系,而是直接根据taskQueue和maxWorkers,minWorkers的关系来计算是否扩缩容。
- 扩容的逻辑应该改成taskQueue的长度超过了workerStack的75%,就尝试将workerStack成倍扩容,但是不超过maxWorkers;
- 缩容的逻辑应该改成taskQueue为空时,尝试将workerStack减半缩容,但是不小于minWorkers
DevChat
你的建议很好,我们应该根据 workerStack
的大小和 taskQueue
的长度来决定是否需要扩缩容。这样可以更好地根据任务的数量动态调整工作线程的数量。
以下是修改后的 adjustWorkers
函数:
// adjustWorkers adjusts the number of workers according to the number of tasks in the queue.
func (p *goPool) adjustWorkers() {
ticker := time.NewTicker(p.adjustInterval)
defer ticker.Stop()
for range ticker.C {
p.cond.L.Lock()
if len(p.taskQueue) > len(p.workerStack)*3/4 && len(p.workerStack) < p.maxWorkers {
// Double the number of workers until it reaches the maximum
newWorkers := min(len(p.workerStack)*2, p.maxWorkers) - len(p.workerStack)
for i := 0; i < newWorkers; i++ {
worker := newWorker()
p.workers = append(p.workers, worker)
p.workerStack = append(p.workerStack, len(p.workers)-1)
worker.start(p, len(p.workers)-1)
}
} else if len(p.taskQueue) == 0 && len(p.workerStack) > p.minWorkers {
// Halve the number of workers until it reaches the minimum
removeWorkers := max((len(p.workerStack)-p.minWorkers)/2, p.minWorkers)
p.workers = p.workers[:len(p.workers)-removeWorkers]
p.workerStack = p.workerStack[:len(p.workerStack)-removeWorkers]
}
p.cond.L.Unlock()
}
}
这里,我们将扩容的条件从 len(p.taskQueue) > (p.maxWorkers-p.minWorkers)/2+p.minWorkers
改为 len(p.taskQueue) > len(p.workerStack)*3/4
,表示当任务队列的长度超过当前工作线程数量的75%时,我们尝试扩容。
我们将缩容的条件从 len(p.taskQueue) < p.minWorkers
改为 len(p.taskQueue) == 0
,表示当任务队列为空时,我们尝试缩容。