dongqichang7988 2018-11-06 19:10
浏览 22
已采纳

goroutine为什么不两次处理同一文件?

I'm looking at the goroutines blog post about patterns with goroutines and channels etc.

In the bounded.go example I see this:

    paths, errc := walkFiles(done, root)

    // Start a fixed number of goroutines to read and digest files.
    c := make(chan result) // HLc
    var wg sync.WaitGroup
    const numDigesters = 20
    wg.Add(numDigesters)
    for i := 0; i < numDigesters; i++ {
        go func() {
            digester(done, paths, c) // HLc
            wg.Done()
        }()
    }

Now since each digester is processing the same paths collection, why doesn't it repeat the same file twice?

  • 写回答

1条回答 默认 最新

  • donglong2856 2018-11-06 19:16
    关注

    walkFiles, which was not reproduced in your question but which is key to understanding it, has the following signature:

    func walkFiles(done <-chan struct{}, root string) (<-chan string, <-chan error)
    

    So in your quoted code, paths isn't a "collection" (i.e. a slice), it's a channel. When each of the workers reads from the channel, it pulls the next path out of the channel. The next worker to receieve from the channel won't get the same path, it will get the next one after that.

    All three of the arguments to digester are channels:

    func digester(done <-chan struct{}, paths <-chan string, c chan<- result) 
    
    • done is used to indicate to the workers that they should stop, even if there is still work queued.
    • paths is the work queue the workers receive paths from.
    • c is the channel that the workers send results on.
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么