当前位置: 首页 > article >正文

go的select多路复用

传统的方法在遍历管道时,如果不关闭会阻塞而导致 deadlock ,在实际开发中,可能我们不好确定什么关闭该管道。使用select来获取channel里面的数据的时候不需要关闭channel
你也许会写出如下代码使用遍历的方式来实现:
for {
// 尝试从 ch1 接收值
data, ok := <-ch1
// 尝试从 ch2 接收值
data, ok := <-ch2
}
这种方式虽然可以实现从多个管道接收值的需求,但是运行性能会差很多。为了应对这种场
景, Go 内置了 select 关键字,可以同时响应多个管道的操作。
select 的使用类似于 switch 语句,它有一系列 case 分支和一个默认的分支。每个 case 会对
应一个管道的通信(接收或发送)过程。 select 会一直等待,直到某个 case 的通信操作完成
时,

 就会执行 case 分支对应的语句

package mainimport ("fmt""time"
)func main() {// 在某些场景下我们需要同时从多个通道接收数据,这个时候就可以用到golang中给我们提供的select多路复用//1.定义一个管道 10个数据intintChan := make(chan int, 10)for i := 0; i < 10; i++ {intChan <- i}//2.定义一个管道 5个数据stringstringChan := make(chan string, 5)for i := 0; i < 5; i++ {stringChan <- "hello" + fmt.Sprintf("%d", i)}//使用select来获取channel里面的数据的时候不需要关闭channelfor {select {case v := <-intChan:fmt.Printf("从 intChan 读取的数据%d\n", v)time.Sleep(time.Millisecond * 50)case v := <-stringChan:fmt.Printf("从 stringChan 读取的数据%v\n", v)time.Sleep(time.Millisecond * 50)default:fmt.Printf("数据获取完毕")return //注意退出...}}}

http://www.lryc.cn/news/2394488.html

相关文章:

  • 深度理解与剖析:前端声明式组件系统
  • 解决8080端口被占问题
  • 介绍一种LDPC码译码器
  • 3DMAX+Photoshop教程:将树木和人物添加到户外建筑场景中的方法
  • 【IOS】【OC】【应用内打印功能的实现】如何在APP内实现打印功能,连接本地打印机,把想要打印的界面打印成图片
  • 随记 配置服务器的ssl整个过程
  • 数据库高可用架构设计:集群、负载均衡与故障转移实践
  • Correlations氛围测试:文本或图像的相似度热图
  • 从0到1:多医院陪诊小程序开发笔记(上)
  • 建立连接后 TCP 请求卡住
  • 尚硅谷redis7 99 springboot整合redis之连接集群
  • hive 笔记
  • 无线通信模块简介
  • Go语言之空接口与类型断言
  • 把 CURSOR 的工具活动栏改成和 VSCODE 一样的左侧展示
  • 碰一碰系统源码搭建==saas系统
  • 不加载PHP OpenTelemetry SDK实现Trace‌与Logs
  • Three.js搭建小米SU7三维汽车实战(6)颜色切换
  • mysql慢sql的实际处理方案之一
  • GitLab 18.0 正式发布,15.0 将不再受技术支持,须升级【六】
  • c/c++的opencv车牌识别
  • 4.2.3 Spark SQL 手动指定数据源
  • 【论文解读】CVPR2023 PoseFormerV2:3D人体姿态估计(附论文地址)
  • WPF的交互核心:命令系统(ICommand)
  • Maven工程演示
  • uniapp分包配置,uniapp设置subPackages
  • 计算机网络 HTTP篇常见面试题总结
  • C++八股 —— 手撕线程池
  • RPA如何支持跨平台和跨浏览器的自动化
  • 【笔记】Windows 成功部署 Suna 开源的通用人工智能代理项目部署日志