使用 goroutines 无限循环遍历文件

Using goroutines to iterate through file indefinitely

我是 Go 的新手,所以请原谅我的无知。我试图用 goroutines 无限期地逐行迭代一堆单词列表。但是当尝试这样做时,它不会重复或中途停止。我将如何在不中断流程的情况下以正确的方式解决这个问题?

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 之间共享 read/write 文件状态是一场数据竞赛,会给你未定义的结果。

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

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

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()
}