gpt4 book ai didi

go - 与 defer wg.Done 和 channel 混淆

转载 作者:数据小太阳 更新时间:2023-10-29 03:39:48 26 4
gpt4 key购买 nike

我在使用 defer wg.Done 和 channel 时遇到问题。

如果我像下面这样编码,就没有问题。

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 <- workergo 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()

这里有什么问题?

最佳答案

好吧,首先,您的 channel 使用困惑并且会阻塞。在 goroutine 中,它从 channel 中读取。但没有写入任何内容。

我不认为你的问题与延迟有任何关系。

关于go - 与 defer wg.Done 和 channel 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49227513/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com