1 回答
TA贡献1804条经验 获得超7个赞
调用的代码serve不应该与填满通道的代码在同一个 goroutine 中运行。
在您的代码中,serve启动处理程序 goroutines 但随后等待<-quit. 由于它被阻止,您永远无法访问填充的代码serveChannel。所以工人们从来没有任何东西可以消费。你也永远不会通知quit,让serve等待永远。
第一步是serveChannel在单独的 goroutine 中发送数据。例如:
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.
}
func populateRequests(serveChannel chan int) {
for i := 0; i < 10; i++ {
serveChannel <- i
}
}
func main() {
var serveChannel = make(chan int)
var quit = make(chan bool)
go populateRequests(serveChannel)
serve(serveChannel, quit)
}
我们现在可以根据需要处理所有请求。
all goroutines are asleep但是,一旦处理完成,您仍然会遇到。这是因为serve最终等待quit信号但没有任何东西可以发送。
在正常程序中,quit将在捕获信号或某些shutdown请求后填充。由于我们没有任何东西,我们将在三秒钟后将其关闭,也在一个单独的 goroutine 中。
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.
}
func populateRequests(serveChannel chan int) {
for i := 0; i < 10; i++ {
serveChannel <- i
}
}
func quitAfter(quit chan bool, duration time.Duration) {
time.Sleep(duration)
quit <- true
}
func main() {
var serveChannel = make(chan int)
var quit = make(chan bool)
go populateRequests(serveChannel)
go quitAfter(quit, 3*time.Second)
serve(serveChannel, quit)
}
至于您的最后一个问题:多个处理程序不会看到相同的请求。当一个处理程序从通道接收到一个值时,该值就会从通道中删除。下一个处理程序将接收下一个值。将通道视为可安全并发使用的先进先出队列。
您可以在操场上找到代码的最后一次迭代。
- 1 回答
- 0 关注
- 112 浏览
添加回答
举报