我有两个(但稍后我将成为三个)go 例程,它们处理来自远程服务器(来自 ampq 通道)的传入消息。但是因为它们处理相同的数据/状态,所以我想阻止所有其他 go 例程,除了正在运行的那个。
我想出了一个解决方案来使用chan bool每个goroutine阻塞然后释放它,代码如下:
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
}
但是第一次每个函数都会 get handleDone <- true,它们将被执行。稍后如果我再添加第三个函数,事情会变得更加复杂。除了 running 之外,如何阻止所有其他 go 程序?还有其他更好的解决方案吗?
缥缈止盈
慕桂英3389331
相关分类