Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 我们应该做嵌套goroutines吗?_Concurrency_Go_Goroutine - Fatal编程技术网

Concurrency 我们应该做嵌套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

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