首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >golang sync.WaitGroup从未完成

golang sync.WaitGroup从未完成
EN

Stack Overflow用户
提问于 2017-03-13 03:06:24
回答 1查看 1.6K关注 0票数 1

下面的代码从通道获取worker并执行函数"call",所有的例程都完成并打印,它们已经完成但等待永远不会结束,我跟踪了WaitGroup的计数器,使变量计数器在添加到wg时递增,在完成时递减,并在for循环的末尾为零,请帮助

代码语言:javascript
运行
复制
package mapreduce

import (
    "fmt"
    "sync"
)

func schedule(jobName string, mapFiles []string, nReduce int, phase jobPhase, registerChan chan string) {
    var ntasks int
    var n_other int // number of inputs (for reduce) or outputs (for map)
    switch phase {
    case mapPhase:
        ntasks = len(mapFiles)
        n_other = nReduce
    case reducePhase:
        ntasks = nReduce
        n_other = len(mapFiles)

    }

    fmt.Printf("Schedule: %v %v tasks (%d I/Os)\n", ntasks, phase, n_other)
    var wg sync.WaitGroup
    for i := 0; i < ntasks; i++ {
        worker := <-registerChan
        doTaskArg := DoTaskArgs{jobName, mapFiles[i], phase, i, n_other}
        wg.Add(1)
        go func() {
            defer wg.Done()

            done := call(worker, "Worker.DoTask", doTaskArg, nil)
            if done {
                registerChan <- worker
            } else {
                i = i - 1
            }

        }()
    }

    wg.Wait()

    fmt.Printf("Schedule: %v phase done\n", phase)
}
EN

Stack Overflow用户

回答已采纳

发布于 2017-03-13 14:26:27

频道阻塞了你的goroutine。如果您将一些数据放入一个未缓冲的通道中,则goroutine将一直等待,直到接收器从该通道获取数据。在本例中,您在register <- workerdefer wg.Done()处的例程块永远不会被调用,因为函数正在等待。

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42751814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档