Effective Go指南有以下处理客户端请求的示例:
func handle(queue chan *Request) {
for r := range queue {
process(r)
}
}
func Serve(clientRequests chan *Request, quit chan bool) {
// Start handlers
for i := 0; i < MaxOutstanding; i++ {
go handle(clientRequests)
}
<-quit // Wait to be told to exit.
}
我在本地运行了类似的代码,其中客户端请求只是整数:
func handle(queue chan int) {
for r := range queue {
fmt.Println("r = ", r)
}
}
func serve(clientRequests chan int, quit chan bool) {
// Start handlers
for i := 0; i < 10; i++ {
go handle(clientRequests)
}
<-quit // Wait to be told to exit.
}
var serveChannel = make(chan int)
var quit = make(chan bool)
serve(serveChannel, quit)
for i := 0; i < 10; i++ {
serveChannel <- i
}
但是我的代码导致死锁错误fatal error: all goroutines are asleep - deadlock!。
即使我从概念上不理解程序中的问题,我也不理解原始代码是如何工作的。我确实理解MaxOutstanding生成了 goroutines 并且它们都听clientRequests单通道。但是clientRequests通道只针对一个请求,所以一旦一个请求进来,那么所有的 goroutine 都可以访问同一个请求。为什么这很有用?
三国纷争
相关分类