我正在尝试为大量文件构建解析器,但我找不到可能称为“嵌套 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/