【发布时间】:2017-10-04 11:37:40
【问题描述】:
第一次使用 go,并尝试让 go 例程和 WaitGroups 正常工作。
我有一个包含 100 行数据的 CSV 文件。 (101 包括标题)
我有以下简单的代码:
package main
import (
"bufio"
"fmt"
"io"
"os"
"sync"
"time"
)
func main() {
start := time.Now()
numRows := 0
waitGroup := sync.WaitGroup{}
file, _ := os.Open("./data.csv")
scanner := bufio.NewScanner(file)
scanner.Scan() // to read the header
for scanner.Scan() {
err := scanner.Err()
if err != nil && err != io.EOF {
panic(err)
}
waitGroup.Add(1)
go (func() {
numRows++
waitGroup.Done()
})()
}
waitGroup.Wait()
file.Close()
fmt.Println("Finished parsing ", numRows)
fmt.Println("Elapsed time in seconds: ", time.Now().Sub(start))
}
当我运行它时,numRows 的输出每次都会在 94 和 100 之间波动。我希望它每次都是100。如果我在 10 行数据的 CSV 上运行相同的代码,它每次都会输出 10。
在我看来,最后几个围棋程序没有及时完成。
我尝试了以下失败的方法:
- 使用
CsvReader而不是Scanner - 将
waitGroup.Add(1)移动到匿名函数下方 - 将匿名 func 移出到包级作用域 func(并使用 ptrs 传递事物)
我错过了什么?
【问题讨论】:
-
在比赛检测器下运行它:-)
标签: go concurrency goroutine