select 多路复用
目录
一、循环接收多个信道的问题
二、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 多路复用相关推荐
- 尝鲜select多路复用
尝鲜select多路复用 问题: 如何增强服务端能力,同时支持多个客户端? Linux的设计哲学 一切皆文件 Linux中的文件是什么? 狭义: 文件系统中物理意义上的文件(逻辑上关联的数据集合) 广 ...
- linux select 多路复用机制
函数作用: 系统提供select函数来实现多路复用输入/输出模型.select系统调用是用来让我们的程序监视多个文件句柄的状态变化的.程序会停在select这里等待,直到被监视的文件句柄有一个或多个发 ...
- C++笔记:select多路复用机制
转载:http://blog.csdn.net/qdx411324962/article/details/42499535 函数作用: 系统提供select函数来实现多路复用输入/输出模型.selec ...
- Linux下Select多路复用实现简易聊天室
前言 和之前的udp聊天室有异曲同工之处,这次我们客户端send的是一个封装好了的数据包,recv的是一个字符串,服务器recv的是一个数据包,send的是一个字符串,在用户连接的时候发送一个logi ...
- Golang的select多路复用以及channel使用实践
看到有个例子实现了一个类似于核弹发射装置,在发射之前还是需要随时能输入终止发射. 这里就可以用到cahnnel 配合select 实现多路复用. select的写法用法有点像switch.但是和swi ...
- Select多路复用
在某些场景下我们需要同时从多个通道接收数据.通道在接收数据时,如果没有数据可以接收将会发生阻塞,而select就可以同时监听一个或多个channel,直到其中一个channel准备好. select的 ...
- golang select channel 多路复用
select多路复用 这个概念与socket网络编程中的select.poll和epoll中的select概念类似.其含义是有N个channel,只要有一个channel上有数据产生,select就会 ...
- python -- IO多路复用
python之路--IO模型 阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) ...
- Linux网络编程之select
使用select多路复用技术的非阻塞模型 select多路复用通常具有很好的跨平台性,也能提供不错的并发性能,但是在通常情况下有最大监听文件描述符的限制(通常1024),如果不需要达到C10K这种前端 ...
最新文章
- powerdesigner类图在子类中显示从父类继承来的方法
- 图论500题 ---- 枚举(最短路上的边)+最短路 删掉任意一条边的最长最短路 HDU1595
- shell学习之shell基础知识了解
- 进击的UI--------------------GETPOST
- python基础知识面试题-干货满满--亲身经历的 Python 面试题
- python——多态
- 技术分享:NodeJS中的Events(事件触发器)讲解
- 使用require.context实现前端工程自动化
- Oracle view 小结片段
- Android学习之调用系统相机实现拍照功能
- 硅谷程序员跳槽排行榜:最爱竟不是 Google 苹果 Facebook!
- 车联网之:操作系统QNX
- Scratch的安装与界面介绍
- Python判断字符串中连续最长的递增英文字母串
- matlab绘制三维立体图
- 员工信息表,增删查改程序
- base64解码是什么
- 右手定则判断法线方向
- android自动弹出浏览器打开文件,android使用主流浏览器打开网页,无需弹出选择。...
- 如何在LabVIEW中调用Python
热门文章
- 免费节点2:使用捷径添加_盒子:找到性能瓶颈的捷径
- Android Context 是什么?
- 国内最完美的sll远程连接工具-finalshell
- python records 库使用方法
- I9 9900K线程_雷蛇推出灵刃15工作室版 英特尔i9-9900KS上架开卖
- 接口测试常见面试题总结
- 【基于物联网的智能草莓种植系统的设计与实现系列教程】8.项目整体验证(课程设计、毕设项目、树莓派、yolov5、物联网)
- java中iterable_java-如何实现Iterable接口?
- 微软的COM中GUID和UUID、CLSID、IID
- Session原理,生命周期