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

我正在查看有关 goroutines 和 channels 等模式的 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集合,为什么它不重复同一个文件两次呢?


哈士奇WWW
浏览 69回答 1
1回答

慕姐8265434

walkFiles,它没有在你的问题中转载,但它是理解它的关键,具有以下签名:func&nbsp;walkFiles(done&nbsp;<-chan&nbsp;struct{},&nbsp;root&nbsp;string)&nbsp;(<-chan&nbsp;string,&nbsp;<-chan&nbsp;error)因此,在您引用的代码中,paths不是“集合”(即切片),而是一个channel。当每个工作人员从通道中读取时,它会将下一条路径拉出通道。下一个从通道接收的工人不会得到相同的路径,它会在那之后得到下一个。的所有三个参数都是digester通道:func&nbsp;digester(done&nbsp;<-chan&nbsp;struct{},&nbsp;paths&nbsp;<-chan&nbsp;string,&nbsp;c&nbsp;chan<-&nbsp;result)done用于向工作人员指示他们应该停止,即使仍有工作在排队。paths是工人从中接收路径的工作队列。c是工人发送结果的渠道。
打开App,查看更多内容
随时随地看视频慕课网APP