我遇到了使用延迟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()
这是什么问题?
答案 0 :(得分:2)
嗯,首先,你的频道使用很混乱,会阻止。在goroutine中,它从频道中读取。但没有写入任何内容。
我认为你的问题与推迟无关。