【发布时间】:2013-03-03 04:52:50
【问题描述】:
我有两个(但以后我会是三个)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
}
但是第一次每个函数都会得到handleDone <- true,它们将被执行。稍后如果我添加另一个第三个函数,事情会变得更加复杂。如何阻止除运行之外的所有其他 go 例程?还有其他更好的解决方案吗?
【问题讨论】:
-
我不认为你的频道做你认为他们做的事,因为你从来没有检查收到的价值。无论如何,使用缓冲通道作为互斥体/信号量可能是危险的。请改用实际的 Mutex。
-
请注意,它们被称为“goroutines”,而不是“goroutines”。这是因为“例程”一词可能指任何过程 PL 中的任何过程/函数,因此“go 例程”听起来像“Go 中的例程”,这使得该术语的预期含义消失了。
标签: go