select 方式进行调度
使用场景:
比如有多个通道,但我打算是哪一个通道先给我数据,我就先执行谁
这个select 可以是并行执行 channel管道
package main
import (
"fmt"
"math/rand"
"time"
)
/**
select 方式进行调度
使用场景:比如有多个通道,但我打算是哪一个通道先给我数据,我就先执行谁
这个select 可以是并行执行 channel管道
*/
// 发送值
func generator() chan int {
out := make(chan int)
go func() {
i := 0
for {
// 随机睡眠, 1500毫秒以内
time.Sleep(time.Duration(rand.Intn(1500)) * time.Millisecond)
// 往 out 这个channel里面传输 i 这个值
out <- i
i++
}
}()
return out
}
func main() {
/**
如果 channel (chan) 是 nil, 在 select里面也是可以使用的,只不过是堵塞状态!
*/
// var c1, c2 chan int // c1 和 c2 是 nil
var c1, c2 = generator(), generator() // 赋值
// 从 channel里面接收数据
//n1 := <- c1
//n2 := <- c2
/**
上面两个通道有数据,是同类型的数据,但是我想谁先给我数据,我就要谁
*/
for {
select {
case n := <- c1:
fmt.Println("从 c1 获取到数据:", n)
case n := <- c2:
fmt.Println("从 c2 获取到数据:", n)
//default:
// fmt.Println("通道内。没有数据!")
}
}
}
网友评论