我有兩個(但後來我會是三個)去處理來自遠程服務器(來自ampq通道)的傳入消息的例程。但是因爲他們正在處理相同的數據/狀態,所以我想阻止除正在運行的其他所有例程。如何阻止除了正在運行的所有goroutines
我想出了一個解決方案中使用chan bool
每個去例行塊,然後鬆開,代碼如下:
package main
func a(deliveries <-chan amqp, handleDone chan bool) {
for d := range deliveries {
<-handleDone // Data comes always, wait for other channels
handleDone <- false // Block other channels
// Do stuff with data...
handleDone <- true // I'm done, other channels are free to do anything
}
}
func b(deliveries <-chan amqp, handleDone chan bool) {
for d := range deliveries {
<-handleDone
handleDone <- false
// Do stuff with data...
handleDone <- true
}
}
func main() {
handleDone := make(chan bool, 1)
go a(arg1, handleDone)
go b(arg2, handleDone)
// go c(arg3, handleDone) , later
handleDone <- true // kickstart
}
但首次各功能將得到handleDone <- true
,他們將被執行。如果我添加另一個第三個函數,事情會變得更加複雜。如何阻止除運行之外的其他所有例程?其他更好的解決方案?
我不認爲你的頻道做你認爲他們做的事,因爲你從來沒有檢查收到的價值。無論如何,使用緩衝通道作爲互斥/信號可能是危險的。改用實際的Mutex。 – JimB 2013-03-15 14:34:22
請注意,它們被稱爲「goroutines」,而不是「go routines」。這是因爲「例程」這個詞可能是指任何程序PL中的任何過程/函數,因此「go routines」聽起來像「Go中的例程」,這使術語的預期意義消失。 – kostix 2013-04-29 07:29:07