我正在看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
集合,为什么它不重复两次相同的文件?
答案 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
是工作人员发送结果的渠道。