从另一个goroutine启动一个goroutine是什么意思



从这个文件中,我不明白为什么函数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() 也是可以的。

最新更新