为什么嵌套goroutine是必需的?
我正在研究MIT 6.824-(第三部分),对一个(迷你)mapreduce的调度程序感到困惑:为什么嵌套goroutine是必需的?,go,goroutine,Go,Goroutine,我正在研究MIT 6.824-(第三部分),对一个(迷你)mapreduce的调度程序感到困惑: var wg sync.WaitGroup for i := 0; i < ntasks; i++ { task_arg := DoTaskArgs{ JobName: jobName, File: mapFiles[i], Phase: phase, TaskNumber: i, NumOtherPhase: n_other } //not so relevant
var wg sync.WaitGroup
for i := 0; i < ntasks; i++ {
task_arg := DoTaskArgs{ JobName: jobName, File: mapFiles[i], Phase: phase, TaskNumber: i, NumOtherPhase: n_other }
//not so relevant
wg.Add(1)
go func() {
defer wg.Done()
reg_worker := <- registerChan
call(reg_worker, "Worker.DoTask", task_arg, nil)
go func() { registerChan <- reg_worker }()
//registerChan <- reg_worker
}()
}
wg.Wait()
寄存器CHAN
未缓冲
我尝试在第
go func(){registerChan行删除goroutine
,因为registerChan没有缓冲,所以内部goroutine非常必要
除非收到,否则发送到无缓冲通道将被阻止。在您的情况下,您有100个任务,这意味着reg\u-worker:=reg\u-worker:=@sahaj我确定完成了50多个任务。所包含的代码中没有任何内容表明为什么它应该完成50多个任务,并在完成所有100个任务之前被卡住。原因应该在代码的其余部分,这使它脱离了主题。registerChan缓冲了吗?@britt不,不是。只需添加一些解释。我也在处理6.824,我建议您将wg.Done()
放在registerChan之前
ch := make(chan string)
go mr.forwardRegistrations(ch)
schedule(mr.jobName, mr.files, mr.nReduce, phase, ch)
defer wg.Done()
reg_worker := <-registerChan
call(reg_worker, "Worker.DoTask", task_arg, nil)
fmt.Println("### start sending to registerChan")
registerChan <- reg_worker
fmt.Println("### send done")