介紹:我剛剛開始學習Go語言,并達到了關于并發(fā)的課程。我為自己發(fā)明了一個小任務,試圖實現(xiàn)我所學到的關于關閉戈魯廷的知識。問題:如果我們關閉信道,它將始終在語句中被選中,這是向所有戈魯丁廣播取消信號的好方法。caseselect下面我有2個戈魯丁和一個從未被接收的頻道。quit操場上的代碼超時。如果我注釋掉戈魯丁中的部分,那么信號就會被接收到。defaultquit問題:我真的不明白為什么會發(fā)生這種情況以及如何解決它,盡管我正在嘗試。有人可以向我解釋問題是什么,并就如何解決它提供一些建議嗎?package mainimport ( "fmt" "sync" "time")func positive_numbers(quit chan struct{}, wg *sync.WaitGroup) { defer wg.Done() i := 1 for { select { case <-quit: fmt.Println("[+]Quiting...") return default: fmt.Printf("%v ", i) i++ } }}func negative_numbers(quit chan struct{}, wg *sync.WaitGroup) { defer wg.Done() i := -1 for { select { case <-quit: fmt.Println("[-]Quiting...") return default: fmt.Printf("%v ", i) i-- } }}func main() { quit := make(chan struct{}) wg := sync.WaitGroup{} // so we can wait for all goroutines to finish wg.Add(2) go positive_numbers(quit, &wg) go negative_numbers(quit, &wg) go func(quit chan struct{}) { defer close(quit) time.Sleep(1 * time.Second) }(quit) wg.Wait()}
1 回答

RISEBY
TA貢獻1856條經(jīng)驗 獲得超5個贊
此代碼在現(xiàn)實生活中工作正常;它只是與游樂場的“假時間”不兼容,因為并且不阻塞,并且運行時無法決定在到期之前運行每個迭代的次數(shù)(基本上,打印需要零模擬的壁鐘時間,因此它們試圖產(chǎn)生無限的輸出,并且您達到了游樂場的CPU使用限制,而根本沒有提前過壁式時鐘時間)。在真實的機器上,你只能在有限的時間內(nèi)打印有限的輸出,你會得到合理的行為。positive_numbers
negative_numbers
Sleep
在游樂場中,如果您在每次打印后添加類似的東西,則強制假時鐘向前移動,程序也會終止。time.Sleep(time.Millisecond)
- 1 回答
- 0 關注
- 93 瀏覽
添加回答
舉報
0/150
提交
取消