目录

一、循环接收多个信道的问题

二、select详解


一、循环接收多个信道的问题

在使用通道时,想同时接收多个通道的数据是一件困难的事情。通道在接收数据时,如果没有数据可以接收将会发生阻塞。

虽然可以使用如下模式进行遍历,但运行性能会非常差。

for{// 尝试接收ch1通道data, ok := <-ch1// 尝试接收ch2通道data, ok := <-ch2// 接收后续通道…
}

二、select详解

Go 语言中提供了 select 关键字,可以同时响应多个通道的操作。select 的每个 case 都会对应一个通道的收发过程。当收发完成时,就会触发 case 中响应的语句。多个操作在每次 select 中挑选一个进行响应。

select{case 操作1:响应操作1case 操作2:响应操作2…default: //可选操作,fallthrough 行为,和普通的 switch 相似,是不允许的。没有操作情况
}

操   作

语句示例

接收任意数据

case <- ch:

接收变量

case d :=  <- ch:

发送数据

case ch <- 100:

select 做的就是:选择处理列出的多个通信情况中的一个,有如下说明:

  • 在任何一个 case 中执行 break 或者 return,select 就结束了
  • 如果都阻塞了,会等待直到其中一个可以处理
  • 如果多个可以处理,随机选择一个
  • 如果没有通道操作可以处理并且写了 default 语句,它就会执行:default 永远是可运行的(这就是准备好了,可以执行)。在 select 中使用发送操作并且有 default 可以确保发送不被阻塞!如果没有 default,select 就会一直阻塞

select 语句实现了一种监听模式,通常用在(无限)循环中;在某种情况下,通过 break 语句使循环退出。

//select  通道的多路复用
package mainimport ("fmt""time"
)//往通道中写数据pump1
func pump1(ch chan int){for i:=1;; i++{ch <- i*2}
}//往通道中写数据pump2
func pump2(ch chan int){for i:=1; ; i++{ch <- i+2}
}//接收通道中的数据
func suck(ch1, ch2 chan int)  {for{select{case v:= <- ch1:fmt.Println("received on channel 1:",v)case v2:= <-ch2:fmt.Println("received on channel 2:", v2)}}
}func main(){ch1 := make(chan int)ch2 := make(chan int)go pump1(ch1)go pump2(ch2)go suck(ch1, ch2)time.Sleep(time.Second)}输出:
Received on channel 2: 5
Received on channel 2: 6
Received on channel 1: 0
Received on channel 2: 7
Received on channel 2: 8
Received on channel 2: 9
Received on channel 2: 10
Received on channel 1: 2
Received on channel 2: 11
...
Received on channel 2: 47404
Received on channel 1: 94346
Received on channel 1: 94348

一秒内的输出非常惊人,如果我们给它计数(goroutine_select2.go),得到了 90000 个左右的数字。

select 多路复用相关推荐

  1. 尝鲜select多路复用

    尝鲜select多路复用 问题: 如何增强服务端能力,同时支持多个客户端? Linux的设计哲学 一切皆文件 Linux中的文件是什么? 狭义: 文件系统中物理意义上的文件(逻辑上关联的数据集合) 广 ...

  2. linux select 多路复用机制

    函数作用: 系统提供select函数来实现多路复用输入/输出模型.select系统调用是用来让我们的程序监视多个文件句柄的状态变化的.程序会停在select这里等待,直到被监视的文件句柄有一个或多个发 ...

  3. C++笔记:select多路复用机制

    转载:http://blog.csdn.net/qdx411324962/article/details/42499535 函数作用: 系统提供select函数来实现多路复用输入/输出模型.selec ...

  4. Linux下Select多路复用实现简易聊天室

    前言 和之前的udp聊天室有异曲同工之处,这次我们客户端send的是一个封装好了的数据包,recv的是一个字符串,服务器recv的是一个数据包,send的是一个字符串,在用户连接的时候发送一个logi ...

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

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

  6. Select多路复用

    在某些场景下我们需要同时从多个通道接收数据.通道在接收数据时,如果没有数据可以接收将会发生阻塞,而select就可以同时监听一个或多个channel,直到其中一个channel准备好. select的 ...

  7. golang select channel 多路复用

    select多路复用 这个概念与socket网络编程中的select.poll和epoll中的select概念类似.其含义是有N个channel,只要有一个channel上有数据产生,select就会 ...

  8. python -- IO多路复用

    python之路--IO模型 阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) ...

  9. Linux网络编程之select

    使用select多路复用技术的非阻塞模型 select多路复用通常具有很好的跨平台性,也能提供不错的并发性能,但是在通常情况下有最大监听文件描述符的限制(通常1024),如果不需要达到C10K这种前端 ...

最新文章

  1. powerdesigner类图在子类中显示从父类继承来的方法
  2. 图论500题 ---- 枚举(最短路上的边)+最短路 删掉任意一条边的最长最短路 HDU1595
  3. shell学习之shell基础知识了解
  4. 进击的UI--------------------GETPOST
  5. python基础知识面试题-干货满满--亲身经历的 Python 面试题
  6. python——多态
  7. 技术分享:NodeJS中的Events(事件触发器)讲解
  8. 使用require.context实现前端工程自动化
  9. Oracle view 小结片段
  10. Android学习之调用系统相机实现拍照功能
  11. 硅谷程序员跳槽排行榜:最爱竟不是 Google 苹果 Facebook!
  12. 车联网之:操作系统QNX
  13. Scratch的安装与界面介绍
  14. Python判断字符串中连续最长的递增英文字母串
  15. matlab绘制三维立体图
  16. 员工信息表,增删查改程序
  17. base64解码是什么
  18. 右手定则判断法线方向
  19. android自动弹出浏览器打开文件,android使用主流浏览器打开网页,无需弹出选择。...
  20. 如何在LabVIEW中调用Python

热门文章

  1. 免费节点2:使用捷径添加_盒子:找到性能瓶颈的捷径
  2. Android Context 是什么?
  3. 国内最完美的sll远程连接工具-finalshell
  4. python records 库使用方法
  5. I9 9900K线程_雷蛇推出灵刃15工作室版 英特尔i9-9900KS上架开卖
  6. 接口测试常见面试题总结
  7. 【基于物联网的智能草莓种植系统的设计与实现系列教程】8.项目整体验证(课程设计、毕设项目、树莓派、yolov5、物联网)
  8. java中iterable_java-如何实现Iterable接口?
  9. 微软的COM中GUID和UUID、CLSID、IID
  10. Session原理,生命周期