select实现斐波那契和超时机制
2024-09-04 10:09:54
package main import "fmt" func fib(ch chan <-int, quit <- chan bool){ x, y := 1, 1 for { //监听channel的流动 select { case ch <- x: x, y = y, x+y case flag := <-quit: fmt.Println("flag=", flag) return } } } func main(){ ch := make(chan int) quit:=make(chan bool) go func() { for i:=0;i<8;i++{ num:=<-ch fmt.Println(num) /* 1 1 2 3 5 8 13 21 flag= true */ } quit <- true }() fib(ch, quit) } /* 分析一下代码的逻辑 首先,对于select,是用来监听管道的流动,多个case,那么能执行,就执行哪个,如果都能执行会随机选择一个 对于case ch<-x,会先往ch里面写进去一个1。然后在子协程中num会接收到。此时x, y = y, x+y,然后继续往ch里面放入数据,然后num接收 当子协程里的for循环执行完毕,那么对于case ch<-x,即便往ch里面放入数据,也没办法取了,因为循环结束了,无法执行num:= <- ch了 所以对于第一个case就卡在那里了,会一直等待着有人把ch里面的数据取走. 然后设置quit<-true,一开始第二个case flag:= <- quit里面是没有数据的,当我们设置值之后有数据了,那么便可以取了,会取到flag=true 然后执行第二个case里面的语句,return结束函数,从而结束程序。 需要注意的是:如果想跳出函数,在select里面不要使用break,因为break也对select起作用,使用break跳出select,但并没有跳出for循环,然后会又来执行select */
package main import ( "fmt" "time" ) func main() { ch := make(chan int) quit := make(chan bool) go func() { for { select { case num:=<-ch: fmt.Println(num) case <-time.After(time.Second * 3): fmt.Println("超时") quit <- true } } }() for i:=0;i<5;i++{ ch <- i } <-quit//主协程会卡在这里,直到超时 fmt.Println("程序结束") } /* 0 1 2 3 4 超时 程序结束 */
最新文章
- IBatis存储过程返回值
- compass General 常用api学习[Sass和compass学习笔记]
- 体验极速Android SDK的更新与下载
- 转:DataSet、DataTable、DataRow、DataColumn区别及使用实例
- HDU 4998 Rotate --几何
- ionic cordova file download and load
- short-path problem (Dijkstra) 分类: ACM TYPE 2014-09-01 23:51 111人阅读 评论(0) 收藏
- Android:开发环境
- Response对象
- Hadoop书籍下载链接
- Android Studio 3.0 使用问题解决方案总结
- pymysql 详解
- [unix]commvault在unix系统上本地安装报“NFS directory cannot be used”
- Spring源码学习(6)——容器的功能扩展
- win10开机自启动
- Django 学习第五天——自定义过滤器及标签
- PAT A1145 Hashing - Average Search Time (25 分)——hash 散列的平方探查法
- C语言第四次实验
- [ 转载 ] Java中常用的设计模式
- 谨慎安装Python3.7.0,SSL低版本导致Pip无法使用