我正在查看有关 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
是工人发送结果的渠道。
- 1 回答
- 0 关注
- 89 浏览
添加回答
举报
0/150
提交
取消