gpt4 book ai didi

go - 等待所有例程完成

转载 作者:IT王子 更新时间:2023-10-29 02:25:31 26 4
gpt4 key购买 nike

第一次使用 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) 移动到匿名函数下面
  • 将匿名函数移出到包级作用域函数中(并使用 ptrs 进行传递)

我错过了什么?

最佳答案

在不同的 goroutine 中同时修改单个变量是不安全的。您对 numRows 的一些更新将会丢失,并且有时您的程序可能会崩溃。

要么使用互斥锁保护您的 numRows 变量,要么使用 atomic 之一以原子方式进行添加的函数:

var numRows int32

// ...

go (func() {
atomic.AddInt32(&numRows, 1)
waitGroup.Done()
})()

关于go - 等待所有例程完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46563875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com