gpt4 book ai didi

golang sync.WaitGroup 永远不会完成

转载 作者:IT王子 更新时间:2023-10-29 02:03:27 26 4
gpt4 key购买 nike

下面的代码从 channel 获取工作人员并执行函数“call”,所有例程完成并打印它们已完成但等待永远不会完成,我通过在添加到 wg 时使变量计数器递增并在完成时递减来跟踪 WaitGroup 的计数器,并且在 for 循环结束时它为零请帮忙

package mapreduce

import (
"fmt"
"sync"
)

func schedule(jobName string, mapFiles []string, nReduce int, phase jobPhase, registerChan chan string) {
var ntasks int
var n_other int // number of inputs (for reduce) or outputs (for map)
switch phase {
case mapPhase:
ntasks = len(mapFiles)
n_other = nReduce
case reducePhase:
ntasks = nReduce
n_other = len(mapFiles)

}

fmt.Printf("Schedule: %v %v tasks (%d I/Os)\n", ntasks, phase, n_other)
var wg sync.WaitGroup
for i := 0; i < ntasks; i++ {
worker := <-registerChan
doTaskArg := DoTaskArgs{jobName, mapFiles[i], phase, i, n_other}
wg.Add(1)
go func() {
defer wg.Done()

done := call(worker, "Worker.DoTask", doTaskArg, nil)
if done {
registerChan <- worker
} else {
i = i - 1
}

}()
}

wg.Wait()

fmt.Printf("Schedule: %v phase done\n", phase)
}

最佳答案

channel 阻塞了你的 goroutine。如果你将一些数据放入一个无缓冲的 channel 中,goroutine 会一直等到接收者从 channel 中获取数据。在您的情况下,您的例程 block 位于 register <- workerdefer wg.Done()永远不会被调用,因为函数正在等待。

关于golang sync.WaitGroup 永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42751814/

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