看了两篇博客,一个说:在任何一个 case 中执行 break 或者 return,select 就结束了。

另一个说:break只能跳出select中的一个case

验证了一下,不知道对不对,感觉是跳出了整个select

func main() {
v := make(chan int)
o := make(chan bool) select {
case d := <-v:
fmt.Println("ddd", d)
case <-time.After(time.Second * 5):
fmt.Println("timeout")
//o <- true
break
}
fmt.Println("ssssssssssssss") time.Sleep(time.Second * 100)
<-o fmt.Println("程序结束")
}
package main

import (
"fmt"
"time"
) /*
1.监听的case中,没有满足条件的就阻塞
2.多个满足的条件就任选一个执行
3.select本身不带循环,需要外层的for循环
4.default通常不用,会产生忙轮训
5.break只能跳出select中的一个case 1.加入了默认分支,那么无论涉及通道操作的表达式是否有阻塞,select语句都不会被阻塞。如果那几个表达式都阻塞了,或者说都没有满足求值的条件,那么默认分支就会被选中并执行。 2.如果没有加入默认分支,那么一旦所有的case表达式都没有满足求值条件,那么select语句就会被阻塞。直到至少有一个case表达式满足条件为止。
如果select语句发现同时有多个候选分支满足选择条件,那么它就会用一种伪随机的算法在这些分支中选择一个并执行。注意,即使select语句是在被唤醒时发现的这种情况,也会这样做
*/ /*
go里面提供了一个关键字select,通过select可以监听channel上的数据流动 select的用法与switch语言非常类似,由select开始一个新的选择块,每个选择块条件由case语句来描述 与switch语句可以选择任何可使用相等比较的条件相比,select有比较多的限制,其中最大的一条限制就是每个case语句里必须是一个IO操作
for{
select {
case <- chan1:
//
case <- chan2:
//
default:
//case表达式都没有满足求值条件,
}
}
*/ /*
在一个select语句中,go语言会按顺序从头到尾评估每一个发送和接收的语句 如果其中的任意一语句可以继续执行(即没有被阻塞),那么就从哪些可以执行的语句中任意选择一条来使用 如果没有任意一条语句可以执行(即所有的通道都被阻塞),那么有两种可能的情况: 如果给出了default语句,那么就会执行default语句,同时程序的执行会从select语句后的语句中恢复
如果没有default语句,那么select语句将被阻塞,直到至少有一个通信可以进行下去
*/ /*
防止channel超时机制
有时候会出现协程阻塞的情况,那么我们如何避免这个情况?我们可以使用select来设置超时
*/ //func main() {
// v := make(chan int)
// o := make(chan bool)
//
// select {
// case d := <-v:
// fmt.Println("ddd", d)
// case <-time.After(time.Second * 5):
// fmt.Println("timeout")
// //o <- true
// break
// }
// fmt.Println("ssssssssssssss")
//
// time.Sleep(time.Second * 100)
// <-o
//
// fmt.Println("程序结束")
//} //超时这种写法也常常用来设置定时执行某段函数
//go func() {
// select {
// case <- time.After(5 * time.Second):
// dosomething()
// }
//} /*
default 语句是可选的;fallthrough 行为,和普通的 switch 相似,是不允许的。在任何一个 case 中执行 break 或者 return,select 就结束了。 select 做的就是:选择处理列出的多个通信情况中的一个。 如果都阻塞了,会等待直到其中一个可以处理
如果多个可以处理,随机选择一个
如果没有通道操作可以处理并且写了default 语句,它就会执行:default 永远是可运行的(这就是准备好了,可以执行)。
在 select 中使用发送操作并且有 default 可以确保发送不被阻塞!如果没有 default,select 就会一直阻塞。 select 语句实现了一种监听模式,通常用在(无限)循环中;在某种情况下,通过 break 语句使循环退出。 */ func main() {
ch1 := make(chan int)
ch2 := make(chan int) go pump1(ch1)
go pump2(ch2)
go suck(ch1, ch2)
time.Sleep(1e9) } func pump1(ch chan int) {
for i := 0; ; i++ {
ch <- i * 2
}
} func pump2(ch chan int) {
for i := 0; ; i++ {
ch <- i + 5
}
} func suck(ch1, ch2 chan int) {
for {
select {
case v := <-ch1:
fmt.Printf("Received on channel 1: %d\n", v)
case u := <-ch2:
fmt.Printf("Received on channel 2: %d\n", u)
}
}
} /*
在程序 goroutine_select.go 中有 2 个通道 ch1 和 ch2,三个协程 pump1()、pump2() 和 suck()。
这是一个典型的生产者消费者模式。
在无限循环中,ch1 和 ch2 通过 pump1() 和 pump2() 填充整数;
suck() 也是在无限循环中轮询输入的,
通过 select 语句获取 ch1 和 ch2 的整数并输出。
选择哪一个 case 取决于哪一个通道收到了信息。程序在 main 执行 1 秒后结束。 -----------------------------------
著作权归作者所有:来自51CTO博客作者宇宙之一粟的原创作品,请联系作者获取转载授权,否则将追究法律责任
Go 语言入门很简单:使用 select 切换协程
https://blog.51cto.com/yuzhou1su/5416579
*/

每日一抄 Go语言使用select切换协程的更多相关文章

  1. 转:一个C语言实现的类似协程库(StateThreads)

    http://blog.csdn.net/win_lin/article/details/8242653 译文在后面. State Threads for Internet Applications ...

  2. 浅谈Go语言的Goroutine和协程

    0x00.前言 前面写了一篇初识Go语言和大家一起学习了Go语言的巨大潜力.语言简史.杀手锏特性等,感兴趣的读者可以回顾一下. 今天来学习Go语言的Goroutine机制,这也可能是Go语言最为吸引人 ...

  3. 038_go语言中的状态协程

    代码演示: package main import ( "fmt" "math/rand" "sync/atomic" "time ...

  4. 基于汇编的 C/C++ 协程 - 切换上下文

    在前一篇文章<基于汇编的 C/C++ 协程 - 背景知识>中提到一个用于 C/C++ 的协程所需要实现的两大功能: 协程调度 上下文切换 其中调度,其实在技术实现上与其他的线程.进程调度没 ...

  5. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

  6. 线程_gevent自动切换CPU协程

    import gevent def f(n): for i in range(n): print (gevent.getcurrent(), i) # gevent.getcurrent() 获取当前 ...

  7. 并发异步编程之争:协程(asyncio)到底需不需要加锁?(线程/协程安全/挂起/主动切换)Python3

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_208 协程与线程向来焦孟不离,但事实上是,线程更被我们所熟知,在Python编程领域,单核同时间内只能有一个线程运行,这并不是什么 ...

  8. C#实现多国语言的界面切换

    在PictureStudio中,我需要实现多国语言的界面切换,而且切换各种语言版本的时候希望程序是动态的加载语言,不希望切换语言后重新启动程序. 实现这样的功能可以有很愚蠢的方法,比如说你可以在程序中 ...

  9. GO学习-(36) Go语言在select语句中实现优先级

    Go语言在select语句中实现优先级 Go语言在select语句中实现优先级 select语句介绍 Go 语言中的 select语句用于监控并选择一组case语句执行相应的代码.它看起来类似于swi ...

  10. GO语言的进阶之路-协程和Channel

    GO语言的进阶之路-协程和Channel 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 看过我之前几篇博客小伙伴可能对Golang语言的语法上了解的差不多了,但是,如果想要你的代码 ...

随机推荐

  1. CSS控制背景图片100%自适应填充布局

    原文地址:http://blog.csdn.net/wd4java/article/details/50537562 .personal_head { width: 100%; height: 35% ...

  2. Datax-web入门配置与启动

    在idea中启动Datax-web 需要先将Datax在本地安装,可以参考这篇文章(datax在win10中的安装) 1.从github上拉取源码 https://github.com/WeiYe-J ...

  3. SpringBoot 自定义启动的logo(即banner)

    1.自定义输出banner样式 推荐生成网站 http://patorjk.com/software/taag/ https://www.bootschool.net/ascii-art 2.配置 A ...

  4. 微服务笔记之Eureka(1)

    1.Eureka是什么? Eureka由Netflix开源,并被Pivatal集成到SpringCloud体系中,它是基于 RestfulAPI 风格开发的服务注册与发现组件,它是一个服务注册中心. ...

  5. Thread记录

    项目用到了线程 所以写出来留作以后复习线程Thread类包含在System.Threading命名空间有关线程的操作主要包含在这个类中现在总结一下Thread的常用方法和属性 Start([参数])/ ...

  6. 网页识别语音插件annyang可以实现识别中文

    <html> <script src="a.js"></script> <script> if (annyang) { var co ...

  7. ClickHouse 使用

    最近mysql报表数据太多,要转移数据到 clickHouse ,顺便学学该数据仓库的使用 中文文档:https://clickhouse.com/docs/zh/ B站学习视频 : https:// ...

  8. Android Studio Gradle 输出信息乱码

    Android Studio Gradle 输出信息出现乱码 如下: > Task :app:compileDebugJavaWithJavacע: ijЩ�����ļ�ʹ�û����ѹ�ʱ�� ...

  9. mybatis-plus 使用 sql 分页

    #分页工具类 /** * 分页参数处理 */public class PageUtil { /** * 分页返回数据封装 * * @param page * @return Map<String ...

  10. webapi fromurl frombody

    https://blog.csdn.net/QiGary/article/details/113979877 在做后台api接口时,常常涉及到Http方法访问问题,其中最基础也是最核心的就是传参问题. ...