从这个文件中,我不明白为什么函数startWorker 是这样写的:
func (p *WorkerPool) dispatch() {
for i := 0; i < p.maxWorkers; i++ {
p.taskQueue[i] = make(chan func())
go startWorker(p.taskQueue[i])
}
}
func startWorker(taskChan chan func()) {
go func() {
var task func()
var ok bool
for {
task, ok = <-taskChan
if !ok {
break
}
// Execute the task.
task()
}
}()
}
如果我是开发人员,我会像这样编写这个函数:
func startWorker(taskChan chan func()) {
var task func()
var ok bool
for {
task, ok = <-taskChan
if !ok {
return
}
// Execute the task.
task()
}
}
根据Francesc Campoy Flores的Go Best Practices,您的陈述是正确的。启动一个 goroutine,同时启动另一个 goroutine,这是多余的。
func (p *WorkerPool) dispatch() {
for i := 0; i < p.maxWorkers; i++ {
p.taskQueue[i] = make(chan func())
go startWorker(p.taskQueue[i])
}
}
这就是它在库中的使用方式。在 startWorker 中删除 go 例程是有意义的。
同样正如彼得在这里提到的,将go startWorker()
行更改为 startWorker()
也是可以的。