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

时间:2018-11-06 19:10:14

标签: go goroutine

我正在看goroutines博客,有关goroutines和通道等的模式。

bounded.go示例中,我看到了这一点:

    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()
        }()
    }

现在,由于每个摘要器都在处理相同的paths集合,为什么它不重复两次相同的文件?

1 个答案:

答案 0 :(得分:2)

walkFiles(未在您的问题中复制,但对理解它至关重要)具有以下签名:

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

因此在您引用的代码中,paths不是“集合”(即切片),而是频道。当每个工作人员从通道读取时,它都会从通道中拉出下一条路径。从该频道接收的下一个工作人员将不会获得相同的路径,此后它将获得下一个。

digester的所有三个参数都是通道:

func digester(done <-chan struct{}, paths <-chan string, c chan<- result) 
  • done用于向工作人员指示即使有排队的工作,他们也应该停止工作。
  • paths是工作人员从中接收路径的工作队列。
  • c是工作人员发送结果的渠道。