1 回答
TA贡献1803条经验 获得超6个赞
您声明file为全局变量。在多个 goroutine 之间共享读/写文件状态是一场数据竞争,会给你带来不确定的结果。
最有可能的是,从任何 goroutine 的最后一次读取停止的地方开始读取。如果那是文件结尾,它可能继续是文件结尾。但是,由于结果未定义,因此无法保证。您的不稳定结果是由于未定义的行为。
这是您的程序的修订版本,它声明了一个局部file变量并使用 async.Waitgroup来同步所有go start()goroutine 和maingoroutine 的完成。程序检查错误。
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()
}
- 1 回答
- 0 关注
- 87 浏览
添加回答
举报
