golang select 和外层的 for 搭配
select语句通常与for循环搭配使用,但并不是必须的。
在某些情况下,select可能会直接放在一个独立的goroutine中,没有外层的for循环。
这通常发生在你知道只会有一次或有限次操作的情况下。
例如,你可能有一个简单的goroutine,它等待一个特定的channel信号,然后执行一次操作:
package main import (
"fmt"
"time"
) func main() {
interrupt := make(chan struct{}) go func() {
// 假设这是接收中断信号的goroutine
<-interrupt
fmt.Println("Interrupt received, shutting down.")
}() // 等待中断信号,无需for循环
select {
case <-interrupt:
return
}
}
在这个例子中,select会阻塞,直到interrupt channel有数据可读。
一旦接收到数据,select就会结束,程序执行后续的关闭操作。
然而,在大多数并发场景中,select与for循环结合使用,以便在多个channel之间持续轮询,直到满足某种退出条件。
在两个或更多goroutine之间使用select时,外层的for循环通常是用来处理以下情况:
1 持久监听:select可能会持续等待来自不同goroutine的消息,这意味着我们需要保持select语句的活性,直到遇到某个特定的退出条件。for循环可以保证这一点,直到出现特定的退出条件(例如,所有的channel都被关闭,或者接收到特定的信号)。
2 非阻塞性检查:即使没有数据可读或可写,for循环也可以配合default子句,用于周期性地检查某些条件,或者执行其他的非阻塞操作。
3 控制并发行为:通过for循环,我们可以控制并发行为,例如限制并发的数量,或者在处理完一批任务后才启动新的任务。
4 处理不确定的结束条件:在并发环境中,何时结束往往不是预先确定的,for循环允许我们持续监控直到满足结束条件,比如所有的工作都被完成。
下面是一个简单的例子,展示了select和for循环的组合,用于处理两个channel的数据:
package main import (
"fmt"
"time"
) func main() {
intChan1 := make(chan int)
intChan2 := make(chan int) // 启动两个goroutines,分别向两个channel发送数据
go func() {
for i := 1; i <= 5; i++ {
intChan1 <- i
time.Sleep(100 * time.Millisecond)
}
close(intChan1)
}() go func() {
for i := 6; i <= 10; i++ {
intChan2 <- i
time.Sleep(150 * time.Millisecond)
}
close(intChan2)
}() // 使用for循环处理两个channel的数据,直到它们都关闭
for {
select {
case value := <-intChan1:
fmt.Printf("Received from channel 1: %d\n", value) case value := <-intChan2:
fmt.Printf("Received from channel 2: %d\n", value) // 当所有channel都关闭时,for循环自然结束
case <-time.After(1 * time.Second):
fmt.Println("Both channels closed, exiting.")
return
}
}
}
在这个例子中,for循环会一直运行,直到两个channel都被关闭,或者超时退出。
case <-time.After(1 * time.Second): 是Go中一个常见的用法,它用于在select语句中设置一个超时条件。
这里的 time.After 函数返回一个channel,当指定的时间过去后,这个channel会发送一个空的结构体【 <-time.After(1 * time.Second) 会从这个channel中接收这个空结构体 】。
在select中,如果有多个case,它会等待可以执行的case,包括这个超时case。
Tool:代码差异比较器、HTML查错器、Llama3在线、SQL格式化
Link:https://www.cnblogs.com/farwish/p/18205120
golang select 和外层的 for 搭配的更多相关文章
- Golang select
Golang下select的功能和Linux IO复用中的select, poll, epoll相似,是监听 channel 操作,当 channel 操作发生时,触发相应的动作. package m ...
- golang select 退出结束goroutine
开启了多个协程 其中一个协程满足条件后终止select, 原以为其他的协程会在后台系统中继续悄悄运行 直到主进程关闭而关闭 . 做一实验发现select 监听退出 会关闭所有监听的goroutine ...
- 关于golang select的用法
1 go的信道 1.1 什么是信道 信道可以理解为go协程之间进行通信的通道. 1.2 信道的声明 所有的信道都关联一个类型,一旦关联了类型,该信道就只能传输该类型的数据,传输其它类型的数据的话就是非 ...
- linux下多路复用模型之Select模型
Linux关于并发网络分为Apache模型(Process per Connection (进程连接) ) 和TPC , 还有select模型,以及poll模型(一般是Epoll模型) Select模 ...
- (大数据工程师学习路径)第四步 SQL基础课程----select详解
准备 在正式开始本内容之前,需要先从github下载相关代码,搭建好一个名为mysql_shiyan的数据库(有三张表:department,employee,project),并向其中插入数据. 具 ...
- mysql基础篇 - SELECT 语句详解
基础篇 - SELECT 语句详解 SELECT语句详解 一.实验简介 SQL 中最常用的 SELECT 语句,用来在表中选取数据,本节实验中将通过一系列的动手操作详细学习 SELEC ...
- 基础select语句详解
在数据库操作语句中,使用最频繁,也被认为最重要的是 SELECT 查询语句.我们已经在不少地方用到了 SELECT * FROM table_name; 这条语句用于查看一张表中的所有内容. 而 SE ...
- go 中 select 源码阅读
深入了解下 go 中的 select 前言 1.栗子一 2.栗子二 3.栗子三 看下源码实现 1.不存在 case 2.select 中仅存在一个 case 3.select 中存在两个 case,其 ...
- Mybatis 高级结果映射 ResultMap Association Collection
在阅读本文章时,先说几个mybatis中容易混淆的地方: 1. mybatis中的列不是数据库里的列而是查询里的列,可以是别名(如 select user_name as userName,这时col ...
- SQL入门学习1-查询基础
2-1 SELECT语句基础 SELECT语句作用 SELECT 语句用于从表中选取数据. 结果被存储在一个结果表中(称为结果集). 重点 使用SELECT语句从表中选取数据. 为列设定显示用的别名 ...
随机推荐
- Java 文件处理完全指南:创建、读取、写入和删除文件详细解析
Java 文件操作 文件处理简介 文件处理是任何应用程序的重要部分.Java 提供了许多用于创建.读取.更新和删除文件的方法. Java 文件处理 Java 中的文件处理主要通过 java.io 包中 ...
- Health Kit接入资质要求详解,开发不迷路!
开发运动/健康应用过程中,需要使用Health Kit提供的数据能力,作为独立的个人开发者或是企业开发者,接入时分别需要满足什么样的条件呢? 个人开发者接入资质审核要求 •个人开发者应用需上架至华为应 ...
- Qt6安装
*:Qt现在基本都是在线安装了,但是下载的速度特别慢,所以此次记录下如何提速,快速安装 一.在线安装器下载 我用的这个(非官网):https://mirrors.tuna.tsinghua.edu.c ...
- Makefile编写模板 & 学习笔记
一.模板 # 伪命令 .PHONY: clean compileSo compileExe run: compileExe @./main compileExe: compileSo @g++ mai ...
- BTC的数据结构
区块链是一个个block所构成的链,或者链表状的数据结构,在比特币中或者区块链中,一个重要的组成部分是哈希指针 指针 在程序运行过程中,需要用到数据.最简单的是直接获取数据,但当数据本身较大,需要占用 ...
- sql 语句系列(行与列处理)[八百章之第一章]
排序时对null进行处理 比如说: select * from EMP order by COMM 我需要对红框部分进行desc处理,也就是从大到小排列. 解析: 重点是如何让null独立出去. se ...
- 如何把jQuery对象转成DOM对象?OR DOM对象转化成jQuery对象
如何把jQuery对象转成DOM对象? 参考:https://www.imooc.com/code/8110 利用数组下标的方式读取到jQuery中的DOM对象 <div>元素一</ ...
- Oracle使用存储过程实现多行对同行数据排列组合
Oracle使用存储过程实现同行数据排列组合 对多行的同一行的多列数据进行排列组合 假设获取的原来的数据如下表 A B C D aa ab ac ad 现在我们需要对数据进行处理,将每一行的数据,类似 ...
- 急速上线 Serverless 钉钉机器人“防疫精灵”
新型冠状病毒疫情肆虐的春节,大家都过得人心惶惶,作为被关在家的程序狗,总觉得要做点什么.于是阿里云 IoT 事业部的几个同学就开始了防疫精灵的开发之路. 从点子到防疫宝,只花了一个下午时间:从防疫宝到 ...
- DataFunTalk:阿里建设一站式实时数仓的经验分享
简介: 本文内容整理于阿里资深技术专家姜伟华在DataFunTalk上的演讲,为大家介绍阿里巴巴基于一站式实时数仓Hologres建设实时数仓的经验和解决方案. 导读:大数据计算正从规模化走向实时化, ...