尝试多个channel同时触发时,select的表现:

package main

import (
"fmt"
"time"
) func loop(ch chan int){
for i := ; i < ; i++ {
ch <- i
}
close(ch)
} func main() {
ch1 := make(chan int, )
ch2 := make(chan int, ) go loop(ch1)
go loop(ch2) for{
select{
case j, ok := <- ch2:
if false == ok {
goto End
}
fmt.Println("ch2", j) case i,ok := <- ch1:
if false == ok {
goto End
}
fmt.Println("ch1", i) case <-time.After( * time.Second):
fmt.Println("time's up")
goto End
}
} End:
fmt.Println("finish!") }

输出

ch1 0
ch1 1
ch1 2
ch1 3
ch1 4
ch1 5
ch1 6
ch1 7
ch1 8
ch1 9
finish!
package main

import (
"fmt"
"time"
) func loop(ch chan int){
for i := ; i < ; i++ {
ch <- i
}
close(ch)
} func main() {
ch1 := make(chan int, )
ch2 := make(chan int, ) go loop(ch2)//把ch2的调度提到前面
go loop(ch1) for{
select{
case j, ok := <- ch2:
if false == ok {
goto End
}
fmt.Println("ch2", j) case i,ok := <- ch1:
if false == ok {
goto End
}
fmt.Println("ch1", i) case <-time.After( * time.Second):
fmt.Println("time's up")
goto End
}
} End:
fmt.Println("finish!") }

输出:

ch2 0
ch2 1
ch2 2
ch2 3
ch2 4
ch2 5
ch2 6
ch2 7
ch2 8
ch2 9
finish!
package main

import (
"fmt"
"time"
"runtime"
) func loop(ch chan int){
for i := ; i < ; i++ {
runtime.Gosched()//给别的goroutine让渡出一些调度时间
ch <- i
}
close(ch)
} func main() {
ch1 := make(chan int, )
ch2 := make(chan int, ) go loop(ch2)
go loop(ch1) for{
select{
case j, ok := <- ch2:
if false == ok {
goto End
}
fmt.Println("ch2", j) case i,ok := <- ch1:
if false == ok {
goto End
}
fmt.Println("ch1", i) case <-time.After( * time.Second):
fmt.Println("time's up")
goto End
}
} End:
fmt.Println("finish!") }

输出:

ch2 0
ch1 0
ch2 1
ch1 1
ch2 2
ch1 2
ch2 3
ch1 3
ch2 4
ch1 4
ch2 5
ch1 5
ch2 6
ch1 6
ch2 7
ch1 7
ch2 8
ch1 8
ch2 9
finish!

golang channel select的更多相关文章

  1. golang的select实现原理剖析

    写在最前面 select为golang提供了多路IO复用机制,和其他IO复用一样,用于检测是否有读写事件是否ready. 本文将介绍一下golang的select的用法和实现原理. 实现原理 gola ...

  2. golang的select典型用法

    golang 的 select 的功能和 select, poll, epoll 相似, 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作. 示例: ch1 := make (chan in ...

  3. golang关键字select的三个例子, time.After模拟socket/心跳超时

    golang关键字select的三个例子, time.After模拟socket/心跳超时   例子1 select会随机选择一个可执行的case   // 这个例子主要说明select是随机选择一个 ...

  4. golang开发:select多路选择

    select 是 Golang 中的一个控制结构,语法上类似于switch 语句,只不过select是用于 goroutine 间通信的 ,每个 case 必须是一个通信操作,要么是发送要么是接收,s ...

  5. golang channel原理

    channel介绍 channel一个类型管道,通过它可以在goroutine之间发送和接收消息.它是Golang在语言层面提供的goroutine间的通信方式. 众所周知,Go依赖于称为CSP(Co ...

  6. golang channel的使用以及调度原理

    golang channel的使用以及调度原理 为了并发的goroutines之间的通讯,golang使用了管道channel. 可以通过一个goroutines向channel发送数据,然后从另一个 ...

  7. 【转】关于 Goroutine Channel Select 的用法和理解

    原文:https://blog.csdn.net/jfkidear/article/details/88661693 ----------------------------------------- ...

  8. golang channel关闭后,是否可以读取剩余的数据

    golang channel关闭后,其中剩余的数据,是可以继续读取的. 请看下面的测试例子. 创建一个带有缓冲的channel,向channel中发送数据,然后关闭channel,最后,从channe ...

  9. Golang的select多路复用以及channel使用实践

    看到有个例子实现了一个类似于核弹发射装置,在发射之前还是需要随时能输入终止发射. 这里就可以用到cahnnel 配合select 实现多路复用. select的写法用法有点像switch.但是和swi ...

随机推荐

  1. 2.2博客系统 |FileField字段 |Media配置

    基于forms组件和Ajax实现注册功能 1 基于forms组件设计注册页面 --点击头像 === 点击input --头像预览: 修改用户选中的文件对象:获取文件对象的路径:修改img的src属性, ...

  2. 练习题|python常用模块

    re模块练习 1.验证手机号是否合法 import re phone_pat = re.compile('^(13\d|14[5|7]\d|15\d|166|17[3|6|7]|18\d)\d{8}$ ...

  3. turbo boost - 睿频加速

    turbo boost就是英特尔睿频加速技术 英特尔睿频加速技术是英特尔酷睿 i7/i5 处理器的独有特性,也是英特尔新宣布的一项技术.这项技术可以理解为自动超频.当开启睿频加速之后,CPU会根据当前 ...

  4. HTTP协议学习笔记(四)

    HTTP协议学习笔记(四) 与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率. 1.用单台虚拟主机实现多个域名 ...

  5. 如何使用 Git LFS 提交大文件?

    参考资料: An open source Git extension for versioning large files Git LFS的使用 如何使用 Git LFS 提交大文件? Git LFS ...

  6. Solidworks实例学习

    1. 扫描绘制 2. 拉伸切除1 3. 拉伸切除2 4. 旋转切除1 5. 旋转切除2 6. 基准面构建 7. 扫描薄壁 8. 放样1 9. 放样2 10. 放样3  

  7. 潭州课堂25班:Ph201805201 周五 (课堂笔记)

    小三角: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  8. 淘宝bug bug bug

    手机淘宝(苹果版)出现了一个挺耀眼的bug...... 待评价有九个,如图 点进去评价6个之后,还有三个 再出来,待评价还是有九个. 重新打开,下拉刷新都不能改变

  9. Vue插件写、用详解(附demo)

    出处http://blog.csdn.net/qq20004604 Vue插件 1.概述 简单来说,插件就是指对Vue的功能的增强或补充. 比如说,让你在每个单页面的组件里,都可以调用某个方法,或者共 ...

  10. look-into-oracle-redo

    https://fritshoogland.wordpress.com/2018/02/05/a-look-into-oracle-redo-part-2-the-discovery-of-the-k ...