为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
神不在的星期二 2021-10-25 19:59:56
我有一个循环,每次迭代我都有一个新的通道源,我应该处理它。好的,最好显示我的代码。我有文件列表,我想要尾随的每个文件(如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 吗?
查看完整描述

1 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

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

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

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

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


查看完整回答
反对 回复 2021-10-25
  • 1 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信