【Golang】Go语言编程思想(六):Channel,第四节,Select

使用 Select

如果此时我们有多个 channel,我们想从多个 channel 接收数据,谁来的快先输出谁,此时应该怎么做呢?答案是使用 select:

package mainimport "fmt"func main() {var c1, c2 chan int // c1 and c2 == nil//n1 := <-c1//n2 := <-c2// 如果我们想同时从 c1 和 c2 接收数据, 谁来的快// 就先要谁, 此时就需要使用 select 来帮助我们完成上述任务select {case n := <-c1:fmt.Println("Received from c1:", n)case n := <-c2:fmt.Println("Received from c2:", n)default:fmt.Println("No value received")}
}

此时程序执行将会输出 default 的内容。为 select 加上一个无限循环,将会一直输出 default 的内容,但是如果去掉 default,将会报错:
在这里插入图片描述
这个错误在说的是,现在没有协程启动并向 channel 当中发送数据。

现在我们新建一个生产 channel 的工厂函数 generator,在 generator 当中,我们开启一个 goroutine,在 goroutine 当中我们开启一个无限循环,每一次迭代随机 sleep 一定时间,并将不断自增的 i i i输入到 channel 当中:

func generator() chan int {out := make(chan int)go func() {i := 0for {time.Sleep(time.Duration(rand.Intn(1500)) * time.Millisecond)out <- ii++}}()return out
}

此时修改 main 函数为:

func main() {c1, c2 := generator(), generator()//n1 := <-c1//n2 := <-c2// 如果我们想同时从 c1 和 c2 接收数据, 谁来的快// 就先要谁, 此时就需要使用 select 来帮助我们完成上述任务for {select {case n := <-c1:fmt.Println("Received from c1:", n)case n := <-c2:fmt.Println("Received from c2:", n)}}
}

得到的结果如下:

Received from c2: 0
Received from c2: 1
Received from c1: 0
Received from c1: 1
Received from c2: 2
Received from c1: 2
Received from c1: 3
Received from c2: 3
Received from c2: 4
... ...

一个更复杂的使用 select 的例子如下,下面的例子对上述代码进行了修改,加入了定时器,并使用 createWorker 和 worker 不断地开启 goroutine 并向 channel 发送数据:

package mainimport ("fmt""math/rand""time"
)func generator() chan int {out := make(chan int)go func() {i := 0for {time.Sleep(time.Duration(rand.Intn(1500)) * time.Millisecond)out <- ii++}}()return out
}func worker(id int, c chan int) {for n := range c {time.Sleep(time.Second)fmt.Printf("Worker %d received %d\n",id, n)}
}func createWorker(id int) chan<- int {c := make(chan int)go worker(id, c)return c
}func main() {var c1, c2 = generator(), generator()var worker = createWorker(0)var values []inttm := time.After(10 * time.Second)tick := time.Tick(time.Second)for {var activeWorker chan<- intvar activeValue intif len(values) > 0 {activeWorker = workeractiveValue = values[0]}select {case n := <-c1:values = append(values, n)case n := <-c2:values = append(values, n)case activeWorker <- activeValue:values = values[1:]case <-time.After(800 * time.Millisecond):// 如果每两次生成数据之间的时间超过了 800ms:fmt.Println("timeout")case <-tick:fmt.Println("queue len:", len(values))case <-tm:fmt.Println("bye")return}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/489939.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中的OpenCV详解

文章目录 Python中的OpenCV详解一、引言二、OpenCV基础操作1、OpenCV简介2、安装OpenCV3、图像读取与显示 三、图像处理技术1、边缘检测2、滤波技术 四、使用示例1、模板匹配 五、总结 Python中的OpenCV详解 一、引言 在当今数字化社会中&#xff0c;图像处理和计算机视觉技术…

基于python的Selenium webdriver环境搭建(笔记)

一、PyCharm安装配置Selenium环境 本文使用环境&#xff1a;windows11、Python 3.8.1、PyCharm 2019.3.3、Selenium 3.141.0 测试开发环境搭建综述 安装python和pycharm安装浏览器安装selenium安装浏览器驱动测试环境是否正确 这里我们直接从第三步开始 1.1 Seleium安装 …

LLMC:大语言模型压缩工具的开发实践

关注&#xff1a;青稞AI&#xff0c;学习最新AI技术 青稞Talk主页&#xff1a;qingkelab.github.io/talks 大模型的进步&#xff0c;正推动我们向通用人工智能迈进&#xff0c;然而庞大的计算和显存需求限制了其广泛应用。模型量化作为一种压缩技术&#xff0c;虽然可以用来加速…

【渗透测试】信息收集二

其他信息收集 在渗透测试中&#xff0c;历史漏洞信息收集是一项重要的工作&#xff0c;以下是相关介绍&#xff1a; 历史漏洞信息收集的重要性 提高效率&#xff1a;通过收集目标系统或应用程序的历史漏洞信息&#xff0c;可以快速定位可能存在的安全问题&#xff0c;避免重复…

TQ15EG开发板教程:使用SSH登录petalinux

本例程在上一章“创建运行petalinux2019.1”基础上进行&#xff0c;本例程将实现使用SSH登录petalinux。 将上一章生成的BOOT.BIN与imag.ub文件放入到SD卡中启动。给开发板插入电源与串口&#xff0c;注意串口插入后会识别出两个串口号&#xff0c;都需要打开&#xff0c;查看串…

微信小程序5-图片实现点击动作和动态加载同类数据

搜索 微信小程序 “动物觅踪” 观看效果 感谢阅读&#xff0c;初学小白&#xff0c;有错指正。 一、功能描述 a. 原本想通过按钮加载背景图片&#xff0c;来实现一个可以点击的搜索button&#xff0c;但是遇到两个难点&#xff0c;一是按钮大小调整不方便&#xff08;网上搜索…

学习笔记:从ncsi/nc-si协议和代码了解网络协议的设计范式

学习笔记&#xff1a;从ncsi/nc-si协议和代码了解网络协议的设计范式 参考文档&#xff1a; https://www.dmtf.org/standards/published_documents https://www.dmtf.org/dsp/DSP0222 https://www.dmtf.org/sites/default/files/standards/documents/DSP0222_1.2.0.pdf参考代…

3D 生成重建030-SV3D合成环绕视频以生成3D

3D 生成重建030-SV3D合成环绕视频以生成3D 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 论文提出了Stable Video 3D (SV3D)——一个用于生成围绕三维物体的高分辨率图像到多视角视频的潜在视频扩散模型。最近关于三维生成的文献提出了将二维生成模型应用于新视图合成…

3D 生成重建035-DiffRF直接生成nerf

3D 生成重建035-DiffRF直接生成nerf 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 本文提出了一种基于渲染引导的三维辐射场扩散新方法DiffRF&#xff0c;用于高质量的三维辐射场合成。现有的方法通常难以生成具有细致纹理和几何细节的三维模型&#xff0c;并且容易出…

Spark执行计划解析后是如何触发执行的?

在前一篇Spark SQL 执行计划解析源码分析中&#xff0c;笔者分析了Spark SQL 执行计划的解析&#xff0c;很多文章甚至Spark相关的书籍在讲完执行计划解析之后就开始进入讲解Stage切分和调度Task执行&#xff0c;每个概念之间没有强烈的关联&#xff0c;因此这中间总感觉少了点…

探索Python的魔法工具箱:functools

文章目录 探索Python的魔法工具箱&#xff1a;functools背景库介绍安装简单库函数使用方法lru_cachepartialreducecmp_to_keytotal_ordering 场景应用缓存数据库查询结果固定函数参数计算序列的累积和自动补全比较方法将比较函数转换为key函数 常见Bug及解决方案Bug 1: lru_cac…

leetcode 3266 K次乘运算后的最终数组II 题解

题目大意 原题面 给你一个数组 nums&#xff0c;然后进行 k 轮游戏&#xff0c;每轮游戏都会选择数组当中最小的元素然后乘上一个数 multiplier&#xff08;题目给出&#xff09;&#xff0c;问你 k 轮游戏结束之后&#xff0c;这个数组长什么样子&#xff0c;所有的元素要对 …

事务管理与锁机制

title: 事务管理与锁机制 date: 2024/12/14 updated: 2024/12/14 author: cmdragon excerpt: 在数据库系统中,事务管理至关重要,它确保多个数据库操作能够作为一个单一的逻辑单元来执行,从而维护数据的一致性和完整性。一个良好的事务管理系统能够解决并发操作带来的问题…

各种消息中间件介绍

消息中间件是一种在分布式系统中实现消息传递的软件架构&#xff0c;它允许不同的应用程序或系统组件之间异步地交换信息。 1. Apache Kafka Kafka是一个分布式流处理平台&#xff0c;能够处理高吞吐量的数据。它主要用于构建实时数据管道和流应用程序。 • Broker&#xff1a;…

mall-admin-web开源项目搭建教程(图文)

本章教程,介绍如何在本地部署运行mall-admin-web这个开源项目。 开源地址:https://gitee.com/macrozheng/mall-admin-web mall-admin-web是一个电商后台管理系统的前端项目,基于Vue+Element实现。主要包括商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计…

使用FastGPT制做一个AI网站日志分析器

越来越的多网站面临每天上千次的扫描和各类攻击&#xff0c;及时发现攻击IP&#xff0c;并有效的屏蔽不良访问成为网站安全的重要保障&#xff0c;这里我们使用AI来完成对网站日志的日常分析。 我们来使用FastGPT来制做一个AI网站日志析器&#xff0c;下面就开始&#xff1a; …

npm : 无法加载文件 D:\nodejs\npm.ps1

问题描述 npm run serve 启动一个Vue项目&#xff0c;报错如下&#xff1a; npm : 无法加载文件 D:\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/? LinkID135170 中的 about_Execution_Policies。…

UE4_贴花_贴花基础知识一

贴花可以将材料和各种材料元素投影到表面上。您可以使用它们来添加独特的效果。贴花 是一种可以投射到网格体&#xff08;包括静态网格体和骨骼网格体&#xff09;上的材质。无论这些网格体的移动性&#xff08;Mobility&#xff09;是静态&#xff08;Static&#xff09;还是可…

ShardingSphereProxy:快速入门

使用 Docker 运行 ShardingSphere 在基于 Docker 安装 ShardingSphere 时&#xff0c;按照官方文档《使用 Docker :: ShardingSphere》所提供的步骤操作即可。 在运行ShardingSphereProxy之前&#xff0c;我们需要基于我们的测试场景修改配置文件&#xff0c;我测试场景中主要…

Unity 获取鼠标点击位置物体贴图颜色

实现 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit)) {textureCoord hit.textureCoord;textureCoord.x * textureMat.width;textureCoord.y * textureMat.height;textureColor textureMat.GetPixel(Mathf.Flo…