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)
我的问题主要针对性能问题.
谢谢你达到那句话!
如果你使用你指定的体系结构,你很有可能耗尽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