1 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果您想在需要關(guān)閉之前返回“合并”頻道,則不。
但這不是問題,您在其中啟動(dòng)的 goroutine 將使用 0 CPU 資源。你不應(yīng)該為此擔(dān)心。
一旦其中一個(gè)通道關(guān)閉,該函數(shù)將結(jié)束,因此 goroutine 將正確終止。您只需要確保至少關(guān)閉一個(gè)通道即可。如果你不能保證這一點(diǎn),goroutine 將永遠(yuǎn)不會(huì)終止,也永遠(yuǎn)不會(huì)被垃圾收集。如果您不控制頻道,您可以傳遞第三個(gè)頻道(或一個(gè)context.Context值)以提供一種正確終止的方式,例如:
func MergeChans(c1, c2, shutdown chan struct{}) chan struct{} {
c3 := make(chan struct{})
go func() {
select {
case <-c1:
close(c3)
case <-c2:
close(c3)
case <-shutdown:
}
}()
return c3
}
如果你想避免額外的 goroutine,那么不要合并它們(case在需要監(jiān)控的地方添加 2 s)。
- 1 回答
- 0 關(guān)注
- 169 瀏覽
添加回答
舉報(bào)