1 回答

TA貢獻1804條經驗 獲得超7個贊
調用的代碼serve不應該與填滿通道的代碼在同一個 goroutine 中運行。
在您的代碼中,serve啟動處理程序 goroutines 但隨后等待<-quit. 由于它被阻止,您永遠無法訪問填充的代碼serveChannel。所以工人們從來沒有任何東西可以消費。你也永遠不會通知quit,讓serve等待永遠。
第一步是serveChannel在單獨的 goroutine 中發(fā)送數據。例如:
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)
}
我們現(xiàn)在可以根據需要處理所有請求。
all goroutines are asleep但是,一旦處理完成,您仍然會遇到。這是因為serve最終等待quit信號但沒有任何東西可以發(fā)送。
在正常程序中,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)
}
至于您的最后一個問題:多個處理程序不會看到相同的請求。當一個處理程序從通道接收到一個值時,該值就會從通道中刪除。下一個處理程序將接收下一個值。將通道視為可安全并發(fā)使用的先進先出隊列。
您可以在操場上找到代碼的最后一次迭代。
- 1 回答
- 0 關注
- 134 瀏覽
添加回答
舉報