我们应该做嵌套的goroutines吗?

maz*_*res 9 concurrency go goroutine

我正在尝试为大量文件构建一个解析器,我找不到关于我称之为"嵌套goroutines"的资源(也许这不是正确的名字?).

给定了很多文件,每个文件都有很多行.我应该这样做:

for file in folder:
    go do1

def do1:
    for line in file:
        go do2

def do2:
    do_something
Run Code Online (Sandbox Code Playgroud)

或者我应该只使用"一级"goroutines,并执行以下操作:

for file in folder:
    for line in file:
        go do_something
Run Code Online (Sandbox Code Playgroud)

我的问题主要针对性能问题.

谢谢你达到那句话!

Ver*_*ran 7

如果你使用你指定的体系结构,你很有可能耗尽CPU/Mem/etc,因为你将创建任意数量的worker.我建议,改为使用允许您通过频道限制的架构.例如:

在主进程中将文件提供到通道中:

for _, file := range folder {
  fileChan <- file
}
Run Code Online (Sandbox Code Playgroud)

然后在另一个goroutine中将文件分成几行并将它们输入到一个通道中:

for {
  select{
  case file := <-fileChan
    for _, line := range file {
      lineChan <- line
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在第3个goroutine中弹出线条并按照你的意愿行事:

for {
  select{
  case line := <-lineChan:
    // process the line
  }
}
Run Code Online (Sandbox Code Playgroud)

这样做的主要优点是你可以创建尽可能多的例程,因为你的系统可以处理并传递它们所有相同的通道,无论哪个常规到达通道都会处理它,所以你可以节流您正在使用的资源量.

这是一个工作示例:http://play.golang.org/p/-Qjd0sTtyP

  • 编写`for line:= range lineChan {}`这是一种非常尴尬和容易出错的方式 (6认同)