在某些场景下我们需要同时从多个通道接收数据。通道在接收数据时,如果没有数据可以接收将会发生阻塞,而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多路复用相关推荐

  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详解 一.循环接收多个信道的问题 在使用通道时,想同时接收多个通道的数据是一件困难的事情.通道在接收数据时,如果没有数据可以接收将会发生阻塞. 虽然可 ...

  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. wamp php http 1.0500,HTTP 错误 500.0 - Internal Server Error C:\php-5.3.5\php.exe - FastCGI 进程意外退出...
  2. 如何正确使用SqlConnection
  3. NCBI SRA数据库使用详解
  4. 10.24T3 解方程 取模意义下运算+秦九韶算法
  5. Linux内存管理(经典)
  6. MVC中返回Json的几种声明方式
  7. 在SQL Server 2005中解决死锁(转)
  8. java体系技术框架_java框架之Spring 核心框架体系结构
  9. compact php,php内置函数使用 compact()
  10. 用于实现 Web 服务的 SOA 编程模型,第 10 部分: SOA 用户角色
  11. C#程序设计语言2.0简介
  12. UNIX环境高级编程(第三版)关于apue.h的用法
  13. 华为鸿蒙os2.0游戏,华为鸿蒙os2.0系统下载-华为鸿蒙系统官方下载入口2.0下载 - 一游网手机游戏...
  14. 基于TCP的在线聊天室
  15. 决策表是什么?怎么使用决策表?
  16. 已发送邮件如何撤回?
  17. 制作自己的iconfont 图片转iconfont
  18. 我的人生历程之第一篇:游戏篇(b)
  19. 浪潮服务器开机没有信号输出,PLC输出指示灯已经点亮但是输出没有信号-工业支持中心-西门子中国...
  20. 【STM32F407的DSP教程】第22章 DSP矩阵运算-放缩,乘法和转置矩阵

热门文章

  1. property field java_Java 中 field 和 variable 区别及相关术语解释
  2. vue后端框架mysql_springboot + vue 前后端结合·数据库查询
  3. 心理正常与异常的区分_心理正常与心理异常的区别是什么呢
  4. 广东省工业和信息化厅关于印发广东省 5G 基站和数据中心总体布局规划 (2021-2025 年)的通知...
  5. 成功解决 安装pywin32时出现python version 3.6-32 required, which was not found in the registry
  6. Py之configobj:configobj的简介、安装、使用方法之详细攻略
  7. ML之Cosin:基于输入图片RGB均值化转为单向vector利用Cosin(余弦相似度)算法进行判别
  8. NLP之word2vec:利用 Wikipedia Text(中文维基百科)语料+Word2vec工具来训练简体中文词向量
  9. CUMCM之2006B:2006之B题: 艾滋病疗法的评价及疗效的预测
  10. CV:Win10下深度学习框架安装之Tensorflow/tensorflow_gpu+Cuda+Cudnn(最清楚/最快捷)之详细攻略(图文教程)