Golang 中国

最近在学习6.824的课程,实验需要go来实现,初学go遇到一个比较疑惑的问题。
下面这种写法的话,没什么问题:

    for i := 0; i < ntasks; i++ {
        wg.Add(1)
        go func(args DoTaskArgs) {
            // defer wg.Done()
            for {
                worker := <-registerChan
                ok := call(worker, "Worker.DoTask", &args, nil)

                if ok {
                    wg.Done()
                    // go func() {
                    registerChan <- worker
                    // }()
                    break
                }
            }
        }(DoTaskArgs{jobName, mapFiles[i], phase, i, n_other})
    }
    wg.Wait()

但是如果我使用defer wg.Done()的话,就会卡住,一直没法wait结束。除非我将if 里面那个用一个go func执行,就可以了。

var wg sync.WaitGroup
    for i := 0; i < ntasks; i++ {
        wg.Add(1)
        go func(args DoTaskArgs) {
            defer wg.Done()
            for {
                worker := <-registerChan
                ok := call(worker, "Worker.DoTask", &args, nil)

                if ok {
                    // go func() {
                    registerChan <- worker
                    // }()
                    break
                }
            }
        }(DoTaskArgs{jobName, mapFiles[i], phase, i, n_other})
    }
    wg.Wait()

所以我不知道这里问题在哪里,是因为wg.Done实际并没有执行成功吗?还是因为其他的问题。

望各位大大指教!

1 回复
bigbear
#1 bigbear • 2018-03-12 12:43

registerChan 写不进去, 堵塞了吧

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。