我是 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()
}
}
謝謝!
uj5u.com熱心網友回復:
您宣告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("wordlist.txt")
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()
}
uj5u.com熱心網友回復:
它不會迭代或中途停止
這清楚地表明您的 main() 函式提前退出,中斷了任何正在進行的異步函式(goroutines)。
你需要一種方法讓你的main()函式等待你的start()函式完成......這使得它本質上是同步的(不需要 goroutine,如此處解釋)
sync.WaitGroup如果您有多個掃描儀(掃描多個來源),則可以使用Using ,如圖所示。
但是在您的情況下,只有一個來源......再次不需要它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/362948.html
上一篇:JS回圈遍歷陣列并用地圖分組
