猿问

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

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

        }

    }()

}

我可以有数千个文件,我想并行运行我的尾巴。如您所见,我的程序将有数千个 goroutine。可以将此循环更改为通道,只有 1 个 goroutine 吗?


神不在的星期二
浏览 177回答 1
1回答

绝地无双

您会在博客文章pipelines 中找到类似的方法(每个文件一个 goroutine)。中的 MD5All 实现parallel.go为每个文件启动一个新的 goroutine。在包含许多大文件的目录中,这可能会分配比机器上可用的内存更多的内存。我们可以通过限制并行读取的文件数量来限制这些分配。在 中bounded.go,我们通过创建固定数量的 goroutine 来读取文件来做到这一点。我们的管道现在分为三个阶段:遍历树、读取和消化文件以及收集摘要。如果您发现自己受到过多 goroutine 分配的内存的限制,您可以组织自己的代码以使用有限数量的 goroutine。(goroutine 本身很便宜,但分配给“魔法”部分的内存可能很大)
随时随地看视频慕课网APP

相关分类

Go
我要回答