2016-08-31 24 views
0

我想知道在Golang中處理「事件」(包含通知器/接收器)概念的正確方法是什麼。我想我需要使用渠道,但不知道最好的方法。在Golang中實現「事件」(包含通知者/接收者)的概念?

具體來說,我有兩名工人下面的程序。在某些情況下,「worker1」進入和退出「快速模式」並通過通道通知。然後「worker2」可以接收此事件。這工作正常,但這兩名工人緊密相連。特別是,如果worker2未運行,則在寫入通道時,worker1會停滯不前。

Golang的最佳實施方式是什麼?基本上,一名工人做了一些事情,並通知任何其他工人。其他工作人員是否傾聽此事件不得阻止工作人員1。理想情況下,可能有任何數量的工作人員可以傾聽此事件。

有什麼建議嗎?

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 {} 
} 
+0

會['sync.Condition'(https://golang.org/pkg/sync/#Cond)是你要尋找什麼? – JimB

+0

[Property change notification in go]可能重複(http://stackoverflow.com/questions/29488010/property-change-notification-in-go) – icza

+0

如果唯一的擔心是阻止寫入渠道。誠然,這不是一個好的解決方案,因爲您需要對緩衝區大小進行一些預先估計。編輯 - 忽略 - 只是注意到他們是bool頻道。 – Sridhar

回答

3

使用非阻塞寫入通道。這樣,如果有人在聽他們收到它。如果沒有人收聽,它不會阻止發送者,儘管事件丟失了。

您可以使用緩衝通道,以便至少某些事件在需要時緩衝。

通過使用select關鍵字和默認情況,實現了非阻塞式發送。默認情況下,它是非阻塞的。沒有默認情況下,選擇將會阻塞,直到其中一個通道變得可用。

代碼片段:

select { 
    case ch <- event: 
     sent = true 
    default: 
     sent = false 
}