3 回答

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
您的主線程正在等待done
,然后退出。同時(shí),您的第一個(gè) go 函數(shù)將 5 個(gè)值通過管道傳輸?shù)?code>ch,然后發(fā)送到done
。
then中的值done
從主線程中讀取,并且恰好發(fā)生在第二個(gè) go 函數(shù)從中讀取最后一個(gè)值之前ch
。當(dāng)它這樣做時(shí),它退出程序。
請(qǐng)注意,如果您的第二個(gè)線程確實(shí)碰巧同時(shí)讀取了ch
和done
,那么您的程序?qū)⑺梨i,因?yàn)橹骶€程永遠(yuǎn)不會(huì)接收 ondone
并且所有正在運(yùn)行的 go 線程將被阻塞以等待在通道上接收。

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊
您不是在等待兩個(gè) goroutine,而是只將一個(gè)值發(fā)送done
到 2 個(gè)接收者,如果第二個(gè)接收者恰好是main
.
使用 aWaitGroup
可以簡化代碼,并允許您輕松等待所需數(shù)量的 goroutine。https://play.golang.org/p/MWknv_9AFKp
ch := make(chan int)
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
defer close(ch)
for i := 0; i < 5; i++ {
ch <- i
}
}()
wg.Add(1)
go func() {
defer wg.Done()
for message := range ch {
fmt.Println(message)
}
}()
wg.Wait()
fmt.Println("Exit")

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超2個(gè)贊
您有兩個(gè)go
并行運(yùn)行的例程。一個(gè)向通道中插入 5 個(gè)數(shù)字,然后向主線程發(fā)出退出信號(hào),另一個(gè)從通道中讀取數(shù)字。
請(qǐng)注意,一旦負(fù)責(zé)將數(shù)字排入通道的 go 例程完成,它就會(huì)向主線程發(fā)出退出信號(hào),而不管讀取數(shù)字的 go 例程是否完成。因此,您可能會(huì)遇到這樣一種情況,即入隊(duì)例程在出隊(duì)完成之前完成,并且主線程退出。
通過添加睡眠,您可以使入隊(duì)例程的壽命更長一些,并讓出隊(duì)例程有機(jī)會(huì)在入隊(duì)例程向主線程發(fā)出退出信號(hào)之前讀取和打印所有數(shù)字。
要解決這個(gè)問題,您可以只在主線程中運(yùn)行出隊(duì)代碼。在這種情況下,無需在 go 例程中運(yùn)行它。
- 3 回答
- 0 關(guān)注
- 162 瀏覽
添加回答
舉報(bào)