1 回答

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
您有四個(gè)正在運(yùn)行的 go 例程:
gen
,你的生成器,寫(xiě)入無(wú)緩沖的輸出通道,直到done
pipeA
,從 讀取gen
,寫(xiě)入無(wú)緩沖的輸出通道,直到done
pipeB
,從 讀取pipeA
,寫(xiě)入無(wú)緩沖的輸出通道,直到done
main
,從pipeB
讀到done
現(xiàn)在,當(dāng)您關(guān)閉時(shí)done
,它完全取決于 go 例程看到它的順序。
如果main
是第一個(gè)看到它done
已關(guān)閉,它將打破 for 循環(huán)并停止消耗pipeB
。但是如果pipeB
仍然嘗試寫(xiě)入輸出通道(ret <- tmp
),它將在那里阻塞;所以它永遠(yuǎn)不會(huì)到達(dá)該<- done
部分。
有兩個(gè)選項(xiàng)可以解決此問(wèn)題:
只在你的生成器中監(jiān)聽(tīng)
done
,并讓其他 go 例程使用for n := range in { }
.select
將您的發(fā)送邏輯也放入 a 中,以便您的生成器和管道可以檢測(cè)何時(shí)done
關(guān)閉。
或者,您可能希望使用緩沖輸出通道,但即使如此,此問(wèn)題仍然可能發(fā)生。
- 1 回答
- 0 關(guān)注
- 140 瀏覽
添加回答
舉報(bào)