使用 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()

    }

}

谢谢!


元芳怎么了
浏览 88回答 1
1回答

慕码人8056858

您声明file为全局变量。在多个 goroutine 之间共享读/写文件状态是一场数据竞争,会给你带来不确定的结果。最有可能的是,从任何 goroutine 的最后一次读取停止的地方开始读取。如果那是文件结尾,它可能继续是文件结尾。但是,由于结果未定义,因此无法保证。您的不稳定结果是由于未定义的行为。这是您的程序的修订版本,它声明了一个局部file变量并使用 async.Waitgroup来同步所有go start()goroutine 和maingoroutine 的完成。程序检查错误。package mainimport (&nbsp; &nbsp; "bufio"&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "os"&nbsp; &nbsp; "sync")func start(filename string, wg *sync.WaitGroup, t int) {&nbsp; &nbsp; defer wg.Done()&nbsp; &nbsp; file, err := os.Open(filename)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(err)&nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; }&nbsp; &nbsp; defer file.Close()&nbsp; &nbsp; lines := 0&nbsp; &nbsp; scanner := bufio.NewScanner(file)&nbsp; &nbsp; for scanner.Scan() {&nbsp; &nbsp; &nbsp; &nbsp; lines++&nbsp; &nbsp; }&nbsp; &nbsp; if err := scanner.Err(); err != nil {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(err)&nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; }&nbsp; &nbsp; fmt.Println(t, lines)}func main() {&nbsp; &nbsp; wg := &sync.WaitGroup{}&nbsp; &nbsp; filename := "wordlist.txt"&nbsp; &nbsp; for t := 0; t < 150; t++ {&nbsp; &nbsp; &nbsp; &nbsp; wg.Add(1)&nbsp; &nbsp; &nbsp; &nbsp; go start(filename, wg, t)&nbsp; &nbsp; }&nbsp; &nbsp; wg.Wait()}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go