我想知道在 Golang 中處理“事件”(帶有通知器/接收器)概念的正確方法是什么。我想我需要使用頻道,但不確定最好的方法。具體來說,我有以下兩個工人的程序。在某些情況下,“worker1”進(jìn)入和退出“快速模式”并通過通道通知?!皐orker2”然后可以接收此事件。這工作得很好,但是這兩個工人是緊密耦合的。特別是,如果 worker2 沒有運(yùn)行,worker1 在寫入通道時會卡住等待。在 Golang 中實(shí)現(xiàn)這個邏輯的最佳方式是什么?基本上,一個工人做某事并通知任何其他工人它已經(jīng)這樣做了。其他worker是否監(jiān)聽這個事件一定不能阻塞worker1。理想情況下,可以有任意數(shù)量的工人可以收聽此事件。有什么建議嗎?var fastModeEnabled = make(chan bool)var fastModeDisabled = make(chan bool)func worker1() { mode := "normal" for { // under some conditions: mode := "fast" fastModeEnabled <- true // later, under different conditions: mode := "normal" fastModeDisabled <- true }}func worker2() { for { select { case <-fastModeEnabled: fmt.Println("Fast mode started") case <-fastModeDisabled: fmt.Println("Fast mode ended") } }}func main() { go worker2() go worker1() for {}}
1 回答

湖上湖
TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個贊
對通道使用非阻塞寫入。這樣,如果有人在聽,他們就會收到它。如果沒有人在收聽,它不會阻止發(fā)送者,盡管事件丟失了。
您可以使用緩沖通道,以便在需要時至少緩沖一些事件。
select您可以通過使用帶有默認(rèn)大小寫的關(guān)鍵字來實(shí)現(xiàn)非阻塞發(fā)送。默認(rèn)設(shè)置為非阻塞。如果沒有默認(rèn)情況,選擇將阻塞,直到其中一個通道可用。
代碼片段:
select {
case ch <- event:
sent = true
default:
sent = false
}
- 1 回答
- 0 關(guān)注
- 266 瀏覽
添加回答
舉報
0/150
提交
取消