如何在Go中用通道替换goroutines循环

时间:2015-08-02 08:11:33

标签: multithreading go goroutine

我有一个循环,每次迭代我都有一个新的通道源,我应该处理。好的,最好显示我的代码。我有文件列表,我想要尾的每个文件(如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?

1 个答案:

答案 0 :(得分:4)

您会在博文pipelines中找到类似的方法(每个文件一个goroutine)。

  

parallel.go中的MD5All实现为每个文件启动一个新的goroutine。 在包含许多大文件的目录中,这可能会分配比计算机上可用内存更多的内存。

     

我们可以通过限制并行读取的文件数来限制这些分配。在bounded.go中,我们通过创建固定数量的goroutine来读取文件   我们的管道现在有三个阶段:走树,读取和消化文件,并收集摘要。

如果您发现自己受到由过多goroutine分配的内存限制,您可以组织自己的代码以使用有限数量的goroutine。 (goroutine本身很便宜,但分配给"魔法"部分的内存可能很大)