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