我是 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/