shi*_*gdo 4 select go goroutine
这类似于go Tutorial select statements,但我没有从该帖子中得到答案。所以我就在这里问了。谢谢回答。
在http://tour.golang.org/concurrency/5中,似乎“case c <- x:”总是准备就绪,这意味着这种情况不会阻塞select语句。
基于“A select 阻塞直到其中一个 case 可以运行,然后执行该 case。如果多个 case 都准备好了,它会随机选择一个。”,当“case <-quit:”也准备好时,select 语句应该从“case c <- x:”和“case <-quit:”中随机选择。但程序总是进入“case <-quit:”情况。
我还将选择块更改为如下所示。然后在前 10 个循环中,程序随机打印 1-6,但程序一旦退出(第 11 次输出),退出通道的值为 0。
我的问题是,如果准备好的案例是随机选择的,那么为什么第11个选择总是退出案例。
select {
case c <- 1:
x, y = y, x+y
case c <- 2:
x, y = y, x+y
case c <- 3:
x, y = y, x+y
case c <- 4:
x, y = y, x+y
case c <- 5:
x, y = y, x+y
case c <- 6:
x, y = y, x+y
case <-quit:
fmt.Println("quit")
return
}
Run Code Online (Sandbox Code Playgroud)
在 case 语句中,您将值发送到c(例如c <- 1),它会阻塞,直到有东西将 c 读取为foo := <- c。当有东西写入时,它会遇到位于并从选择中返回的quit情况。<-quit
从这个例子来看
package main
import (
"fmt"
"time"
)
func main() {
c := make(chan int)
quit := make(chan struct{})
go func(q chan<- struct{}) {
time.Sleep(5 * time.Second)
q <- struct{}{}
}(quit)
go func(ch chan<- int) {
var x int
for range time.Tick(1 * time.Second) {
c <- x
x++
}
}(c)
for {
select {
case foo := <-c:
fmt.Println("Foo", foo)
case bar := <-c:
fmt.Println("Bar", bar)
case <-quit:
fmt.Println("quit")
return
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以看到机器上随机打印的值:
$ go run foo.go
Bar 0
Bar 1
Foo 2
Bar 3
quit
$ go run foo.go
Bar 0
Foo 1
Bar 2
Bar 3
quit
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4150 次 |
| 最近记录: |