Golang Channel select

jidacwj · · 6077 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Golang 中对Channel 的支持添加了select关键字,

Golang中基于Channel select的实现由监控、定时器等示例参考http://blog.csdn.net/kjfcpua/article/details/18263839

执行流程有点类似switch case,case 后只能接channel输出,可以用变量接收:num:=<-ch

若所有的case后的channel都没有输出,则继续循坏等待,若所有的case后的channel均有输出,则随机选择一个case执行。


但是与for循坏有很大区别,应该是加入了sleep机制,不会占满CPU,下面程序监测程序,与for循环做对比。

  1 package main

  2 
  3 import(
  4     "time"
  5 )
  6 var quit chan int = make(chan int)
  7 func loop(ch chan int) {
  8     select {
  9         case <-ch:
 10         case <-time.After(time.Duration(20)*time.Second): quit <-0
 11         }
 12 }
 13 func gofor(ch chan int){
 14     for{ 
 15         _,ok:= <-ch;
 16         if ok {
 17             break
 18         }
 19     }
 20 }
 21 func main () {
 22     ch := make(chan int)
 23     /*
 24     close(ch)
 25     loop(ch)
 26     <-quit
 27     */ 
 28     go gofor(ch)
 29     time.Sleep(10*time.Second)
 30     ch<-0
 31 }

结果分析:

执行Channel select:CPU占用0.0%


执行for循环:CPU占用101%



有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:jidacwj

查看原文:Golang Channel select

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6077 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传