リモート サーバー (ampq チャネル) からの受信メッセージを処理する 2 つの (後で 3 つになります) go ルーチンがあります。しかし、それらは同じデータ/状態で処理しているため、実行中のものを除いて、他のすべての go ルーチンをブロックしたいと考えています。
各 go ルーチンのブロックを使用して解放するソリューションを考え出しました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
し、それが実行されます。後で別の 3 番目の関数を追加すると、事態はさらに複雑になります。実行中以外のすべての go ルーチンをブロックするにはどうすればよいですか? 他のより良い解決策はありますか?