loops - 使用 goroutine 无限期地迭代文件

标签 loops file go iteration goroutine

我是 Go 新手,请原谅我的无知。我试图用 goroutine 无限期地逐行迭代一堆单词列表。但当尝试这样做时,它不会迭代或中途停止。我该如何以正确的方式处理这个问题而不破坏流程?

package main

import (
    "bufio"
    "fmt"
    "os"
)


var file, _ = os.Open("wordlist.txt")
func start() {
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
       fmt.Println(scanner.Text())
    }

}

func main(){
    for t := 0; t < 150; t++ {
        go start()
        fmt.Scanln()
    }
}

谢谢!

最佳答案

您将file声明为全局变量。在多个 goroutine 之间共享读/写文件状态是一种数据竞争,并且会给您带来未定义的结果。

最有可能的是,读取从任何 goroutine 的最后一次读取停止的地方开始。如果这是文件结尾,那么它很可能仍然是文件结尾。但是,由于结果未定义,因此无法保证。您的不稳定结果是由于未定义的行为造成的。

这是程序的修订版本,它声明了本地 file 变量并使用 sync.Waitgroup 来同步所有 go start() 的完成 goroutine 和 main goroutine。该程序检查错误。

package main

import (
    "bufio"
    "fmt"
    "os"
    "sync"
)

func start(filename string, wg *sync.WaitGroup, t int) {
    defer wg.Done()

    file, err := os.Open(filename)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer file.Close()

    lines := 0
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        lines++
    }
    if err := scanner.Err(); err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(t, lines)
}

func main() {
    wg := &sync.WaitGroup{}
    filename := "wordlist.txt"
    for t := 0; t < 150; t++ {
        wg.Add(1)
        go start(filename, wg, t)
    }
    wg.Wait()
}

关于loops - 使用 goroutine 无限期地迭代文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70052373/

相关文章:

Python 每 5 分钟重复一次算法

java - BufferedReader 不显示文件中的正常字符

php - 检查文件是否存在,不存在则创建

json - 通过 header 错误代码返回或 JSON 响应终止 http 请求

macos - If 和 else 扰乱了 golang 中的变量作用域

json - Go结构类型的可变JSON结构映射

c - C/C++ 中的循环限制

python - for mysql id 字典中的循环与值

c - 在 C 语言中对文件中的数组进行排序

javascript - 从数组中获取 Id 并切换它