困惑推迟wg.Done和频道

时间:2018-03-12 02:51:00

标签: go

我遇到了使用延迟wg.Done和频道的问题。

如果我编码如下,则没有问题。

for i := 0; i < ntasks; i++ {
    wg.Add(1)
    go func(args DoTaskArgs) {
        // defer wg.Done()
        for {
            worker := <-registerChan
            ok := call(worker, "Worker.DoTask", &args, nil)
            if ok {
                wg.Done()
                // go func() {
                registerChan <- worker
                // }()
                break
            }
        }
    }(DoTaskArgs{jobName, mapFiles[i], phase, i, n_other})
}
wg.Wait()

但如果我使用defer wg.Done(),则代码会被卡住,除非用registerChan <- worker包裹go func

for i := 0; i < ntasks; i++ {
    wg.Add(1)
    go func(args DoTaskArgs) {
        defer wg.Done()
        for {
            worker := <-registerChan
            ok := call(worker, "Worker.DoTask", &args, nil)
            if ok {
                // go func() {
                registerChan <- worker
                // }()
                break
            }
        }
    }(DoTaskArgs{jobName, mapFiles[i], phase, i, n_other})
}
wg.Wait()

这是什么问题?

1 个答案:

答案 0 :(得分:2)

嗯,首先,你的频道使用很混乱,会阻止。在goroutine中,它从频道中读取。但没有写入任何内容。

我认为你的问题与推迟无关。