1 回答

TA貢獻(xiàn)1803條經(jīng)驗 獲得超6個贊
您聲明file為全局變量。在多個 goroutine 之間共享讀/寫文件狀態(tài)是一場數(shù)據(jù)競爭,會給你帶來不確定的結(jié)果。
最有可能的是,從任何 goroutine 的最后一次讀取停止的地方開始讀取。如果那是文件結(jié)尾,它可能繼續(xù)是文件結(jié)尾。但是,由于結(jié)果未定義,因此無法保證。您的不穩(wěn)定結(jié)果是由于未定義的行為。
這是您的程序的修訂版本,它聲明了一個局部file變量并使用 async.Waitgroup來同步所有g(shù)o 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 關(guān)注
- 70 瀏覽
添加回答
舉報