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

时间:2019-06-21 02:40:31

标签: go

this file开始,我不明白为什么函数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()
    }
}

1 个答案:

答案 0 :(得分:-1)

根据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()