为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
哈士奇WWW 2023-05-08 14:40:36
我正在查看有关 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集合,为什么它不重复同一个文件两次呢?
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

walkFiles,它没有在你的问题中转载,但它是理解它的关键,具有以下签名:

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

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

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

func digester(done <-chan struct{}, paths <-chan string, c chan<- result)
  • done用于向工作人员指示他们应该停止,即使仍有工作在排队。

  • paths是工人从中接收路径的工作队列。

  • c是工人发送结果的渠道。


查看完整回答
反对 回复 2023-05-08
  • 1 回答
  • 0 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信