我有一个循环,每次迭代我都有一个新的通道源,我应该处理。好的,最好显示我的代码。我有文件列表,我想要尾的每个文件(如tail -f)。我正在使用github.com/ActiveState/tail
包。
for _, tailFile := range files {
t, _ := tail.TailFile(tailFile, c)
// Goroutine per tailing file
go func() {
for line := range t.Lines { // t.Lines is a channel
// Do some magic here
}
}()
}
我可以拥有数千个文件,我想并行运行我的尾巴。如你所见,我的程序将有数千个goroutines。这个循环可以改为通道,只有1个goroutine?
答案 0 :(得分:4)
您会在博文pipelines中找到类似的方法(每个文件一个goroutine)。
parallel.go
中的MD5All实现为每个文件启动一个新的goroutine。 在包含许多大文件的目录中,这可能会分配比计算机上可用内存更多的内存。我们可以通过限制并行读取的文件数来限制这些分配。在
bounded.go
中,我们通过创建固定数量的goroutine来读取文件 我们的管道现在有三个阶段:走树,读取和消化文件,并收集摘要。
如果您发现自己受到由过多goroutine分配的内存限制,您可以组织自己的代码以使用有限数量的goroutine。 (goroutine本身很便宜,但分配给"魔法"部分的内存可能很大)