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()
信号量thelength=append(长度,长度)
正在并发执行。这是不安全的,并且会导致诸如slice中缺少条目之类的问题。您可以通过将追加调用包装在互斥锁中来解决此问题,或者让gorountines将其结果发布到通道,并有一个单独的位置将其收集到slice中。在这种情况下wg.Wait()
不应该在go例程之后?@HamzaAnis-hrrm-它不应该在go例程之后,对吗?它在两个for
循环之后。这会改变什么吗?好的,我理解问题,您在这里得到的值的数量不同,顺序在您的情况下并不重要。wg.Wait()当你需要数组中的有序数据时,应该在go例程之后。@HamzaAnis-你是对的-这就解决了它。你能解释一下为什么会这样吗?我假设wg.Wait
只是告诉所有人等待所有go例程完成,不管它是在调用go例程之后还是正确的在函数退出之前?始终在竞赛检测器下运行并发代码。