gpt4 book ai didi

go - 为什么需要嵌套 goroutine?

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

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

这个程序

  1. 从 channel call 将 100 个任务部署到 2 个工作人员(使用 registerChan)
  2. 任务完成后将worker放回channel
  3. 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没有缓冲。

我尝试删除 goroutinego func() { registerChan <- reg_worker }() 行使其成为: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

最佳答案

内部 goroutine 非常必要,因为 registerChan 没有缓冲!

除非收到,否则发送到无缓冲 channel 会被阻止。在你的例子中,你有 100 个任务,这意味着 reg_worker := <- registerChanregisterChan <- reg_worker将被调用 100 次。似乎发送/接收是平衡的,对吧?

但是,您仍然有 2 个 worker !必须有类似 registerChan <- new_worker 的东西在你的代码中的某处(很可能是 mr.forwardRegistrations(ch) ),它应该被调用 2 次!

因此,在无缓冲 channel 上发送比接收多两次,所以最后 2 registerChan <- reg_worker被阻止,那么defer wg.Done()wg.Wait()也被屏蔽了!

要验证它,你可以这样调试:

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

统计这两个句子出现的次数即可。应该是 100 和 98!

关于go - 为什么需要嵌套 goroutine?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45030652/

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