为什么嵌套goroutine是必需的?

为什么嵌套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

我正在研究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

    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")