concurrency - 我们应该做嵌套的 goroutines 吗?

标签 concurrency go goroutine

我正在尝试为大量文件构建解析器,但我找不到可能称为“嵌套 goroutines”的信息(也许这不是正确的名称?)。

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

for file in folder:
    go do1

def do1:
    for line in file:
        go do2

def do2:
    do_something

或者我应该只使用“一个级别”的 goroutine,并执行以下操作:

for file in folder:
    for line in file:
        go do_something

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

感谢您说出那句话!

最佳答案

如果您使用您指定的架构,您很有可能会用完 CPU/Mem/etc,因为您将创建任意数量的 worker 。我建议,改为使用允许您通过 channel 进行节流的架构。例如:

在您的主进程中,将文件馈送到 channel 中:

for _, file := range folder {
  fileChan <- file
}

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

for {
  select{
  case file := <-fileChan
    for _, line := range file {
      lineChan <- line
    }
  }
}

然后在第三个 goroutine 中弹出这些行并按照您的意愿处理它们:

for {
  select{
  case line := <-lineChan:
    // process the line
  }
}

这样做的主要优点是,您可以创建尽可能多或尽可能少的 goroutine,只要您的系统可以处理并将它们传递给所有相同的 channel ,无论哪个 goroutine 先到达 channel ,都会处理它,所以您能够限制您正在使用的资源量。

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

关于concurrency - 我们应该做嵌套的 goroutines 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21789287/

相关文章:

c# - 多个线程可以同时向并发集合添加项目吗?

java - 在 ConcurrentLinkedQueue 源代码中无法获取此条件

go - goroutines 垃圾是否与其 channel 一起收集?

go - 如何在 Golang 中使用 goroutines 读取标准输入?

c++ - 队列的同步问题

http - Scala海量网址下载

go - Google Cloud Storage-同时列出对象(Go)

go - 如何处理对数组数据

go - 模仿Python在Go列表中理解一系列数字

listen 和 serve 的 goroutine 会阻塞主进程的执行,永远不会到达以下用于通信的选择状态