登录
首页 >  Golang >  Go问答

为何goroutine不重复处理同一个文件?

来源:stackoverflow

时间:2024-03-24 20:27:42 195浏览 收藏

本文探讨了为什么在 Goroutine 模式中,多个 Goroutine 不会重复处理同一文件。作者指出,在示例代码中,paths 不是一个集合(切片),而是一个通道。当每个 Goroutine 从通道中读取数据时,它会从通道中拉出下一条路径,而下一个 Goroutine 将获得之后的下一条路径,从而避免了重复处理。

问题内容

我正在查看关于 goroutine 和通道等模式的 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 集合,为什么它不重复相同的文件两次?


解决方案


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 是工作人员发送结果的通道。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《为何goroutine不重复处理同一个文件?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>