我有兩個渠道,上游和下游。我的目標是從上游讀取數(shù)據(jù)并將它們傳遞給下游。但是,當上下文被取消時,我想優(yōu)雅地退出而不會出現(xiàn)死鎖。我試圖變得“聰明”并做了類似以下的事情。func main() { upstream := make(chan struct{}) ctx, cancel := context.WithCancel(context.Background()) go func() { <-time.After(5 * time.Second) cancel() }() // Buffered downstream ensures no blocking in this scenario downstream := make(chan struct{}, 1) select { case <-ctx.Done(): log.Println("context is killed") case downstream <- <-upstream: log.Println("transferred value from upstream to downstream") }}然后我陷入了僵局。但是,如果我不再懶惰并執(zhí)行以下操作,func main() { upstream := make(chan struct{}) ctx, cancel := context.WithCancel(context.Background()) go func() { <-time.After(5 * time.Second) cancel() }() // Buffered downstream ensures no blocking in this scenario downstream := make(chan struct{}, 1) select { case <-ctx.Done(): log.Println("context is killed") case val := <-upstream: downstream <-val log.Println("transferred value from upstream to downstream") }}它完美地退出,沒有死鎖。請您賜教,兩者之間的主要區(qū)別是什么downstream <- <-upstream和val := <-upstreamdownstream <-val
1 回答

米琪卡哇伊
TA貢獻1998條經(jīng)驗 獲得超6個贊
select 語句不是在<-upstream接收語句上運行,而是在downstream <-send 語句上運行。
在選擇案例可以確定downstream <-發(fā)送語句是否準備好之前,它首先必須評估參數(shù)表達式,即<-upstream. 因為沒有任何東西被發(fā)送到upstream,所以該評估被阻止。這意味著您根本不會接觸到選定的案例。
等效的多行代碼看起來像這樣,這很明顯為什么它不起作用。
val := <-upstream
select {
case <-ctx.Done():
log.Println("context is killed")
case downstream <- val:
log.Println("transferred value from upstream to downstream")
}
- 1 回答
- 0 關(guān)注
- 96 瀏覽
添加回答
舉報
0/150
提交
取消