【发布时间】:2017-12-15 06:52:13
【问题描述】:
我正在研究 MIT 6.824 - lab1(第三部分),但对(迷你)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()
这个程序
- 从频道
registerChan将 100 个任务部署到 2 个工作人员(使用call) - 任务完成后将工作人员放回频道
-
wg.Add()、wg.Done、wg.Wait()同步
如何调用schedule (https://github.com/WentaoZero/mini-mapreduce/blob/master/master.go#L84):
ch := make(chan string)
go mr.forwardRegistrations(ch)
schedule(mr.jobName, mr.files, mr.nReduce, phase, ch)
registerChan 未缓冲。
我尝试在go func() { registerChan <- reg_worker }() 行删除goroutine 以使其成为:registerChan <- reg_worker
在完成 50 多个任务后程序卡住。我想它证明了 goroutine 正在工作,但我不明白它为什么会卡住。
registerChan <- reg_worker已经写在一个goroutine里了,为什么还要用另一个goroutine来包装呢?
我不认为系统的其余部分是相关的,所以我不会在这里发布。如果需要,您可以查看https://github.com/WentaoZero/mini-mapreduce。此调度程序选自https://github.com/WentaoZero/mini-mapreduce/blob/master/schedule.go
【问题讨论】:
-
reg_worker :=
-
@sahaj 我确信已经完成了 50 多个任务。
-
包含的代码中没有任何内容表明为什么它应该完成 50 多个任务并在完成所有 100 个任务之前卡住。原因应该在代码的其余部分中,这使得这个话题离题了。
-
registerChan 缓冲了吗?
-
@britt 不,不是。只需添加一些解释即可。