两个generator,1个worker消耗,如果worker处理慢(worker处理sleep 5s)。则会出现有些n没有打印。

package mainimport ("fmt""time""math/rand"
)func generator() chan int {out := make(chan int)go func() {i := 0for {time.Sleep(time.Duration(rand.Intn(1500)) *time.Millisecond)out <- ii++}}()return out
}
func worker(id int, c chan int) {for n := range c {time.Sleep(5 * time.Second)fmt.Printf("Worker %d received %d\n",id, n)}
}
// <- chan
// chan <-
func createWorker(id int) chan <- int {c := make(chan int)go worker(id, c)return c
}
func main() {//var c1, c2 chan int // c1 and c2 = nilvar c1, c2 = generator(), generator()worker := createWorker(0)n := 0hasValue := falsefor {var activeWorker chan<- intif hasValue {activeWorker = worker}select {case n = <-c1://fmt.Println("Received from c1:", n)hasValue = truecase n = <-c2://fmt.Println("Received from c2", n)hasValue = truecase activeWorker <- n:hasValue = false}}
}

代码:https://github.com/NIGHTFIGHTING/go_learning/blob/master/src/channel/select/select.go

package mainimport ("fmt""time""math/rand"
)func generator() chan int {out := make(chan int)go func() {i := 0for {time.Sleep(time.Duration(rand.Intn(1500)) *time.Millisecond)out <- ii++}}()return out
}
func worker(id int, c chan int) {for n := range c {// 模拟worker处理慢情况//time.Sleep(5 * time.Second)time.Sleep(1 * time.Second)fmt.Printf("Worker %d received %d\n",id, n)}
}
// <- chan
// chan <-
func createWorker(id int) chan <- int {c := make(chan int)go worker(id, c)return c
}
func main() {//var c1, c2 chan int // c1 and c2 = nilvar c1, c2 = generator(), generator()worker := createWorker(0)var values []inttm := time.After(10 * time.Second)tick := time.Tick(time.Second)for {var activeWorker chan<- int // activeWorker is nil,下面activeWorker <- activeValue会阻塞var activeValue intif len(values) > 0 {activeWorker = workeractiveValue = values[0]}select {case n := <-c1:// 缓存数据values = append(values, n)case n := <-c2:// 缓存数据values = append(values, n)case activeWorker <- activeValue:// 数据为准备号activeWorker是nil channel,这里会不会执行values = values[1:]case <- time.After(800 * time.Millisecond):// 没有tick情况下表示,800ms内generator没有生成数据// 有tick表示,两次select处理时差是否超过800msfmt.Println("timeout")case <- tick:fmt.Println("queue len = ", len(values))case <- tm:// 这段程序运行10s退出fmt.Println("bye")return}}
}

10-4 用select进行调度相关推荐

  1. 【操作系统/OS笔记10】进程/线程的调度原则、调度算法、实时调度、多处理器调度、优先级反转

    本次笔记内容: 8.1 背景 8.2 调度原则 8.3 调度算法1 8.4 调度算法2 8.5 实时调度 8.6 多处理调度与优先级反转 文章目录 CPU调度背景 上下文切换 CPU调度 在进程/线程 ...

  2. 面向大数据与云计算调度挑战的阿里经济体核心调度系统

    编者按 伏羲(Fuxi)是十年前最初创立飞天平台时的三大服务之一(分布式存储 Pangu,分布式计算 MaxCompute,分布式调度 Fuxi),当时的设计初衷是为了解决大规模分布式资源的调度问题( ...

  3. 大数据千亿级离线数仓项目第五天 指标统计/导出和工作流调度

    千亿级数仓第05天讲义 课程目标 掌握常见指标PV.UV的开发统计 掌握流量常见指标分类 掌握指标数据导出 理解工作流调度流程 模块开发–数据入库 创建ODS层数据表 原始日志数据表 drop tab ...

  4. mysql select语法_MySQL SELECT语法(一)SELECT语法详解

    SELECT的语法如下: SELECT[ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT ...

  5. 智源青年科学家梁云:异构系统中张量计算的自动调度和优化框架

    与6位图灵奖得主和100多位专家 共同探讨人工智能的下一个十年 长按图片,内行盛会,首次免费注册 北京智源大会倒计时:9天  计算机体系结构领域国际顶级会议每次往往仅录用几十篇论文,录用率在20%左右 ...

  6. mysql select in 怎么优化

    2017年7月10日 22:36:54 星期一 原理: 把select where in 变换成 "where = " 或者 "where between and &qu ...

  7. mysql查询后10条数据类型_30多条mysql数据库优化方法,千万级数据库记录查询轻松解决...

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  8. 10.11杭州Clouder lab 十分钟搭建共享应用 2:如何通过日志服务实现用户的日志收集与分析...

    场景描述 共享电动车企业使用函数服务搭建服务端.在函数服务中开启日志,把程序日志写到日志服务,同时在函数代码中使用SDK把运营日志写入到日志服务,使用日志服务进行日志分析. 在日志服务中,用户可以: ...

  9. select的5中子句where,group by, havaing, order by, limit的使用顺序及实例

    -- 语法: SELECT select_list FROM table_name [ WHERE search_condition ] [ GROUP BY group_by_expression ...

最新文章

  1. python脚本 通过rsa private key 生成 publickey
  2. 年报系统课堂讨论记录
  3. Python-技术篇-使用logging模块打印详细报错日志,获取报错信息位置行数方法
  4. 分布式是什么,集群又是什么呢
  5. Cocos游戏引擎3D特效全新升级 更流畅更炫酷
  6. 贷款不还会有什么后果?
  7. 创意夜晚行驶迷路网站404页面源码
  8. Java中的Instanceof
  9. IS-IS拓展功能补充(华为设备)
  10. GSM劫持+短信嗅探 “半夜盗刷”
  11. ie ajax十分卡,解决jquery .ajax 在IE下卡死问题的解决方法
  12. 小米平板刷机shell怎么退_黑龙江省宁安市小米平板1的刷机经历刷入DotOS并退回MIUI-最懂产品的运维...
  13. 3dmax导出fbx模型到unity
  14. PS:如何使用PS制作好看的文字图片,以CSDN分类专栏图标为例
  15. linux使用vmware虚拟机玩LOL
  16. 微信二维码 活码转跳
  17. 数字电视音视频马赛克和不同步现象原因
  18. 2017 年节点——T 型成长,持续学习
  19. 全国计算机一级课件,2017全国计算机一级考试习题及答案课件.doc
  20. arduino+A4889+步进电机

热门文章

  1. 上海政府版WINXP真相大揭秘
  2. PHP Checkbox获取选中项与
  3. 人生长途,感受着不断拼搏...
  4. 职场80后新人修炼五诀
  5. Linux 命令(127)—— wget 命令
  6. C++赋值操作符重载
  7. ThinkPHP 数据库操作(一) : 连接数据库
  8. Git 入门 ---- Git 与 SVN 区别
  9. C#生成不重复随机数列表
  10. 本地邮件系统的安装及配置