Concurrency 我们应该做嵌套goroutines吗?
我正在尝试为大量文件构建一个解析器,但我找不到关于可能被称为“嵌套goroutines”的信息(可能这不是正确的名称?) 给定很多文件,每个文件都有很多行。我应该做:Concurrency 我们应该做嵌套goroutines吗?,concurrency,go,goroutine,Concurrency,Go,Goroutine,我正在尝试为大量文件构建一个解析器,但我找不到关于可能被称为“嵌套goroutines”的信息(可能这不是正确的名称?) 给定很多文件,每个文件都有很多行。我应该做: for file in folder: go do1 def do1: for line in file: go do2 def do2: do_something 或者我应该只使用goroutines的“一级”,并执行以下操作: for file in folder: for
for file in folder:
go do1
def do1:
for line in file:
go do2
def do2:
do_something
或者我应该只使用goroutines的“一级”,并执行以下操作:
for file in folder:
for line in file:
go do_something
我的问题主要针对性能问题
谢谢你说出那句话 如果您使用指定的体系结构,很可能会耗尽CPU/Mem/etc,因为您将创建任意数量的工作人员。我建议,改为采用一种允许您通过通道节流的架构。例如: 在主进程中,将文件馈送到通道:
for _, file := range folder {
fileChan <- file
}
for {
select{
case file := <-fileChan
for _, line := range file {
lineChan <- line
}
}
}
对于uz,文件:=范围文件夹{
fileChan答案取决于每条线路上操作的处理器密集程度
如果行操作是短期的,那么绝对不要为每行生成goroutine
如果它很贵(考虑到5秒或更多),请小心。你可能内存不足。1.4,生成GOODUTIN分配一个2048字节的堆栈。对于200万行,你可以为GOODOTN栈分配超过2GB的RAM。考虑它是否值得分配这个内存。
简而言之,通过以下设置,您可能会获得最佳效果:
for file in folder:
go process_file(file)
如果文件的数量超过CPU的数量,您可能有足够的并发性来屏蔽从磁盘读取文件时所涉及的磁盘I/O延迟。是否很难同时尝试并查看?我认为这可能很大程度上取决于您的操作系统、磁盘和文件系统。并行性太低意味着阻止等待I/O,太多的means disk-thrashing.goroutines是独立调度的。无论您是从嵌套循环还是从嵌套函数调用它们,都无关紧要。调用N个goroutines就是调用N个goroutines.IMHO还有其他更好的工具适合这种工作,不要重新发明weel,看看hadoop或spark项目不要为每一行创建一个goroutine,创建工作进程池并接收消息。+不要使用通道发送每一行。而是对它们进行批处理或分组。Chan send/receive不是免费的。对于line:=range lineChan{}
for file in folder:
go process_file(file)