Select多路复用
在某些场景下我们需要同时从多个通道接收数据。通道在接收数据时,如果没有数据可以接收将会发生阻塞,而select就可以同时监听一个或多个channel,直到其中一个channel准备好。
select的使用类似于switch语句,它有一系列case分支和一个默认的分支。每个case会对应一个通道的通信(接收或发送)过程。select会一直等待,直到某个case的通信操作完成时,就会执行case分支对应的语句。具体格式如下:
select {case <-chan1:// 如果chan1成功读到数据,则进行该case处理语句case chan2 <- 1:// 如果成功向chan2写入数据,则进行该case处理语句default:// 如果上面都没有成功,则进入default处理流程}
package mainimport ("fmt""time"
)func test1(ch chan string) {time.Sleep(time.Second * 1)ch <- "test1"
}
func test2(ch chan string) {time.Sleep(time.Second * 2)ch <- "test2"
}func main() {// 2个管道output1 := make(chan string)output2 := make(chan string)// 跑2个子协程,写数据go test1(output1)go test2(output2)for {// 用select监控select {case s1 := <-output1:fmt.Println("s1=", s1)case s2 := <-output2:fmt.Println("s2=", s2)default:ticker := time.NewTicker(1 * time.Second)fmt.Printf("%v\n", <-ticker.C)}}
}
判断通道是否已经存满
package mainimport ("fmt""time"
)// 判断管道有没有存满
func main() {// 创建管道output1 := make(chan string, 1)// 子协程写数据go write(output1)// 取数据for s := range output1 {fmt.Println("res:", s)time.Sleep(time.Second)}
}func write(ch chan string) {for {select {// 写数据case ch <- "hello":fmt.Println("write hello")default:fmt.Println("channel full")}time.Sleep(time.Millisecond * 500)}
}
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详解 一.循环接收多个信道的问题 在使用通道时,想同时接收多个通道的数据是一件困难的事情.通道在接收数据时,如果没有数据可以接收将会发生阻塞. 虽然可 ...
- 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这种前端 ...
最新文章
- wamp php http 1.0500,HTTP 错误 500.0 - Internal Server Error C:\php-5.3.5\php.exe - FastCGI 进程意外退出...
- 如何正确使用SqlConnection
- NCBI SRA数据库使用详解
- 10.24T3 解方程 取模意义下运算+秦九韶算法
- Linux内存管理(经典)
- MVC中返回Json的几种声明方式
- 在SQL Server 2005中解决死锁(转)
- java体系技术框架_java框架之Spring 核心框架体系结构
- compact php,php内置函数使用 compact()
- 用于实现 Web 服务的 SOA 编程模型,第 10 部分: SOA 用户角色
- C#程序设计语言2.0简介
- UNIX环境高级编程(第三版)关于apue.h的用法
- 华为鸿蒙os2.0游戏,华为鸿蒙os2.0系统下载-华为鸿蒙系统官方下载入口2.0下载 - 一游网手机游戏...
- 基于TCP的在线聊天室
- 决策表是什么?怎么使用决策表?
- 已发送邮件如何撤回?
- 制作自己的iconfont 图片转iconfont
- 我的人生历程之第一篇:游戏篇(b)
- 浪潮服务器开机没有信号输出,PLC输出指示灯已经点亮但是输出没有信号-工业支持中心-西门子中国...
- 【STM32F407的DSP教程】第22章 DSP矩阵运算-放缩,乘法和转置矩阵
热门文章
- property field java_Java 中 field 和 variable 区别及相关术语解释
- vue后端框架mysql_springboot + vue 前后端结合·数据库查询
- 心理正常与异常的区分_心理正常与心理异常的区别是什么呢
- 广东省工业和信息化厅关于印发广东省 5G 基站和数据中心总体布局规划 (2021-2025 年)的通知...
- 成功解决 安装pywin32时出现python version 3.6-32 required, which was not found in the registry
- Py之configobj:configobj的简介、安装、使用方法之详细攻略
- ML之Cosin:基于输入图片RGB均值化转为单向vector利用Cosin(余弦相似度)算法进行判别
- NLP之word2vec:利用 Wikipedia Text(中文维基百科)语料+Word2vec工具来训练简体中文词向量
- CUMCM之2006B:2006之B题: 艾滋病疗法的评价及疗效的预测
- CV:Win10下深度学习框架安装之Tensorflow/tensorflow_gpu+Cuda+Cudnn(最清楚/最快捷)之详细攻略(图文教程)