Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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
Go 结果与并发函数不一致?_Go_Concurrency - Fatal编程技术网

Go 结果与并发函数不一致?

Go 结果与并发函数不一致?,go,concurrency,Go,Concurrency,我试图同时处理文件中的行,但由于某些原因,我似乎得到了不一致的结果。下面是我的代码的简化版本: var wg sync.WaitGroup semaphore := make(chan struct{}, 2) lengths:= []int{} for _, file := range(args[1:]){ // Open the file and start reading it reader, err := os.Open(file) if err

我试图同时处理文件中的行,但由于某些原因,我似乎得到了不一致的结果。下面是我的代码的简化版本:

  var wg sync.WaitGroup
  semaphore := make(chan struct{}, 2)
  lengths:= []int{}

  for _, file := range(args[1:]){
    // Open the file and start reading it
    reader, err := os.Open(file)
    if err != nil {
      fmt.Println("Problem reading input file:", file)
      fmt.Println("Error:", err)
      os.Exit(0)
    }
    scanner := bufio.NewScanner(reader)
    // Start streaming lines
    for scanner.Scan() {
      wg.Add(1)
      text := scanner.Text()
      semaphore <- struct{}{}
      go func(line string) {
          length := getInformation(line)
          lengths = append(lengths, length)
          <-semaphore
          wg.Done()
      }(text)
    }
  }
  wg.Wait()
  sort.Ints(lengths)
  fmt.Println("Lengths:", lengths)
var wg sync.WaitGroup
信号量:=make(chan结构{},2)
长度:=[]整数{}
对于z,文件:=范围(参数[1:]){
//打开文件并开始读取它
读卡器,错误:=os.Open(文件)
如果错误!=零{
Println(“读取输入文件时出现问题:”,文件)
fmt.Println(“错误:”,错误)
操作系统退出(0)
}
扫描仪:=bufio.NewScanner(读卡器)
//启动流媒体线路
对于scanner.Scan(){
工作组.添加(1)
text:=scanner.text()

信号量the
length=append(长度,长度)
正在并发执行。这是不安全的,并且会导致诸如slice中缺少条目之类的问题。您可以通过将追加调用包装在互斥锁中来解决此问题,或者让gorountines将其结果发布到通道,并有一个单独的位置将其收集到slice中。

在这种情况下
wg.Wait()
不应该在go例程之后?@HamzaAnis-hrrm-它不应该在go例程之后,对吗?它在两个
for
循环之后。这会改变什么吗?好的,我理解问题,您在这里得到的值的数量不同,顺序在您的情况下并不重要。wg.Wait()当你需要数组中的有序数据时,应该在go例程之后。@HamzaAnis-你是对的-这就解决了它。你能解释一下为什么会这样吗?我假设
wg.Wait
只是告诉所有人等待所有go例程完成,不管它是在调用go例程之后还是正确的在函数退出之前?始终在竞赛检测器下运行并发代码。