学习golang(12) 初探:协程(3)多个chan之select选择器

简介: 学习golang(12) 初探:协程(3)多个chan之select选择器

我们近些天一直在看go协程,关于协程基础和协程间通信,请看之前的博文

初探理解select





什么是select选择器


什么是select选择器

select选择器和goswitch很相似,只不过select能够处理的对象是chan,那,我们为什么需要select呢,如果我们有多个chan在处理的时候,select可以帮助我们选择符合要求的chan,如果都满足要求,那就回随机选择一个返回。



语法对比一下select和switch


我们对比一下switchselect语法

对于switch而言,当多个case满足条件的时候,它会顺序执行,不做介入的情况下,执行完一个case后则退出switch, 而select则不同,当case条件满足的时候,它会随机执行case,具体我们看看案例。



switch 案例

switch

image.png


我们执行下看下结果

image.png


我们通过之前学习的结果可得,若case匹配成功,则会走响应的分支,无法匹配成功,则会走到default分支中。


select案例

反观select呢,我们写个例子看下

image.png


我们定义了2个无缓冲管道,一个是bool类型的,一个是int类型的,紧接着我们开启一个协程,中间接入了一个select,分别对boolChanintChan取值,最后我们等待3秒往boolChan发送true,又3秒,我们向intChan发送3,我们执行下,看下结果

image.png


这里简单介绍一下select机制,若在select中没有default分支,那么当没有case条件满足时,它会等待,等待所检测的管道有数据进来,若有default的时候,若执行当下select语句时,若不匹配任何case,则会执行default


我们再反过来看代码,我们由于没有在selectdefault分支,所以该语句会等,等某一个case条件匹配时,那正好,我们往boolChan发送了一个true,满足了该case,所以会执行“接收到bool chan 的值” , 好,执行完后,select就执行完毕了,我们再向intChan发送数字3,但是此时我们没有代码去做管道读取,所以会引发deadlock panic




小demo


通过上述案例,我们知晓了select在没有default分支的情况下,只会有一个case被满足,否则会一直等待,所以我们可以根据此案例,写一个发送撤回器。


即,我们写一个小demo,该demo会输出一个信息,我们若在10秒内不干预,则发送,否则撤销发送,

其中核心点,表示select了,我们在其中写入2个case

  • cancel bool
  • time.after

time.After会在多少时间后返回一个<-chan Time , 而cancel则需要我们自行输入,这意味着,若我们不介入撤销发送,则消息在规定的时间后会发送成功。

image.png


好,我们执行下代码

image.png

举一反三,我们甚至于利用select可以编写一个服务器心跳包。



总结


我们了解了什么是select,其实从某种意义来说,它和linux select多路复用有点异曲同工之妙,总的来讲,我们在设计的时候若不加入default分支,那么select会一直等待,等待某个case条件满足,满足后,执行分支,退出select,注意,当有多个case满足条件的时候,它会随机选择一个执行,而非顺序执行哦。










相关文章
|
2月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
86 4
|
12天前
|
存储 安全 测试技术
GoLang协程Goroutiney原理与GMP模型详解
本文详细介绍了Go语言中的Goroutine及其背后的GMP模型。Goroutine是Go语言中的一种轻量级线程,由Go运行时管理,支持高效的并发编程。文章讲解了Goroutine的创建、调度、上下文切换和栈管理等核心机制,并通过示例代码展示了如何使用Goroutine。GMP模型(Goroutine、Processor、Machine)是Go运行时调度Goroutine的基础,通过合理的调度策略,实现了高并发和高性能的程序执行。
75 29
|
10天前
|
Go 计算机视觉
在Golang高并发环境中如何进行协程同步?
在此示例中,使用互斥锁来保护对共享计数器变量 c 的访问,确保并发的 HTTP 请求不会产生数据竞争。
31 3
|
10天前
|
负载均衡 算法 Go
GoLang协程Goroutiney原理与GMP模型详解
【11月更文挑战第4天】Goroutine 是 Go 语言中的轻量级线程,由 Go 运行时管理,创建和销毁开销小,适合高并发场景。其调度采用非抢占式和协作式多任务处理结合的方式。GMP 模型包括 G(Goroutine)、M(系统线程)和 P(逻辑处理器),通过工作窃取算法实现负载均衡,确保高效利用系统资源。
|
1月前
|
前端开发 Java API
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
本文是Vert.x学习系列的第五部分,讨论了回调函数的限制、Future和Promise在异步操作中的应用、响应式扩展以及Kotlin协程,并通过示例代码展示了如何在Vert.x中使用这些异步编程模式。
47 5
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
|
2月前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
50 4
Golang语言goroutine协程篇
|
1月前
|
安全 Java Go
【Golang入门】简介与基本语法学习
Golang语言入门教程,介绍了Go语言的简介、基本语法、程序结构、变量和常量、控制结构、函数、并发编程、接口和类型、导入包、作用域以及错误处理等关键概念,为初学者提供了一个全面的学习起点。
23 0
|
3月前
|
机器学习/深度学习 存储 人工智能
Golang bytes 包学习
Golang bytes 包学习
24 3
|
3月前
|
监控 Go
|
3月前
|
Go 开发者