我有两个(但稍后我会是三个)处理来自远程服务器(来自 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
}
但是第一次每个函数都会得到handleDone <- true
,它们将被执行。稍后如果我添加另一个第三个函数,事情会变得更加复杂。如何阻止除运行之外的所有其他 go 例程?还有其他更好的解决方案吗?