尝试多个channel同时触发时,select的表现:

package main

import (
"fmt"
"time"
) func loop(ch chan int){
for i := ; i < ; i++ {
ch <- i
}
close(ch)
} func main() {
ch1 := make(chan int, )
ch2 := make(chan int, ) go loop(ch1)
go loop(ch2) for{
select{
case j, ok := <- ch2:
if false == ok {
goto End
}
fmt.Println("ch2", j) case i,ok := <- ch1:
if false == ok {
goto End
}
fmt.Println("ch1", i) case <-time.After( * time.Second):
fmt.Println("time's up")
goto End
}
} End:
fmt.Println("finish!") }

输出

ch1 0
ch1 1
ch1 2
ch1 3
ch1 4
ch1 5
ch1 6
ch1 7
ch1 8
ch1 9
finish!
package main

import (
"fmt"
"time"
) func loop(ch chan int){
for i := ; i < ; i++ {
ch <- i
}
close(ch)
} func main() {
ch1 := make(chan int, )
ch2 := make(chan int, ) go loop(ch2)//把ch2的调度提到前面
go loop(ch1) for{
select{
case j, ok := <- ch2:
if false == ok {
goto End
}
fmt.Println("ch2", j) case i,ok := <- ch1:
if false == ok {
goto End
}
fmt.Println("ch1", i) case <-time.After( * time.Second):
fmt.Println("time's up")
goto End
}
} End:
fmt.Println("finish!") }

输出:

ch2 0
ch2 1
ch2 2
ch2 3
ch2 4
ch2 5
ch2 6
ch2 7
ch2 8
ch2 9
finish!
package main

import (
"fmt"
"time"
"runtime"
) func loop(ch chan int){
for i := ; i < ; i++ {
runtime.Gosched()//给别的goroutine让渡出一些调度时间
ch <- i
}
close(ch)
} func main() {
ch1 := make(chan int, )
ch2 := make(chan int, ) go loop(ch2)
go loop(ch1) for{
select{
case j, ok := <- ch2:
if false == ok {
goto End
}
fmt.Println("ch2", j) case i,ok := <- ch1:
if false == ok {
goto End
}
fmt.Println("ch1", i) case <-time.After( * time.Second):
fmt.Println("time's up")
goto End
}
} End:
fmt.Println("finish!") }

输出:

ch2 0
ch1 0
ch2 1
ch1 1
ch2 2
ch1 2
ch2 3
ch1 3
ch2 4
ch1 4
ch2 5
ch1 5
ch2 6
ch1 6
ch2 7
ch1 7
ch2 8
ch1 8
ch2 9
finish!

golang channel select的更多相关文章

  1. golang的select实现原理剖析

    写在最前面 select为golang提供了多路IO复用机制,和其他IO复用一样,用于检测是否有读写事件是否ready. 本文将介绍一下golang的select的用法和实现原理. 实现原理 gola ...

  2. golang的select典型用法

    golang 的 select 的功能和 select, poll, epoll 相似, 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作. 示例: ch1 := make (chan in ...

  3. golang关键字select的三个例子, time.After模拟socket/心跳超时

    golang关键字select的三个例子, time.After模拟socket/心跳超时   例子1 select会随机选择一个可执行的case   // 这个例子主要说明select是随机选择一个 ...

  4. golang开发:select多路选择

    select 是 Golang 中的一个控制结构,语法上类似于switch 语句,只不过select是用于 goroutine 间通信的 ,每个 case 必须是一个通信操作,要么是发送要么是接收,s ...

  5. golang channel原理

    channel介绍 channel一个类型管道,通过它可以在goroutine之间发送和接收消息.它是Golang在语言层面提供的goroutine间的通信方式. 众所周知,Go依赖于称为CSP(Co ...

  6. golang channel的使用以及调度原理

    golang channel的使用以及调度原理 为了并发的goroutines之间的通讯,golang使用了管道channel. 可以通过一个goroutines向channel发送数据,然后从另一个 ...

  7. 【转】关于 Goroutine Channel Select 的用法和理解

    原文:https://blog.csdn.net/jfkidear/article/details/88661693 ----------------------------------------- ...

  8. golang channel关闭后,是否可以读取剩余的数据

    golang channel关闭后,其中剩余的数据,是可以继续读取的. 请看下面的测试例子. 创建一个带有缓冲的channel,向channel中发送数据,然后关闭channel,最后,从channe ...

  9. Golang的select多路复用以及channel使用实践

    看到有个例子实现了一个类似于核弹发射装置,在发射之前还是需要随时能输入终止发射. 这里就可以用到cahnnel 配合select 实现多路复用. select的写法用法有点像switch.但是和swi ...

随机推荐

  1. 012 Spark在IDEA中打jar包,并在集群上运行(包括local模式,standalone模式,yarn模式的集群运行)

    一:打包成jar 1.修改代码 2.使用maven打包 但是目录中有中文,会出现打包错误 3.第二种方式 4.下一步 5.下一步 6.下一步 7.下一步 8.下一步 9.完成 二:在集群上运行(loc ...

  2. 051 日志案例分析(PV,UV),以及动态分区

    1.实现的流程 需求分析 时间:日,时段 分区表:两级 PV UV 数据清洗 2015-08-28 18:19:10 字段:id,url,guid,tracktime 数据分析 导出 2.新建源数据库 ...

  3. Python爬虫之Beautiful Soup解析库的使用(五)

    Python爬虫之Beautiful Soup解析库的使用 Beautiful Soup-介绍 Python第三方库,用于从HTML或XML中提取数据官方:http://www.crummv.com/ ...

  4. C#:几种数据库的大数据批量插入(转)

    在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解 ...

  5. BZOJ.2034.[2009国家集训队]最大收益(二分图匹配 贪心)

    题目链接 双倍经验:BZOJ.4276.[ONTAK2015]Bajtman i Okrągły Robin(然而是个权限题.区间略有不同) \(Description\) 有\(n\)个任务,完成一 ...

  6. BZOJ.2437.[NOI2011]兔兔与蛋蛋游戏(二分图博弈 匈牙利)

    题目链接 首先空格的移动等价于棋子在黑白格交替移动(设起点移向白格就是黑色),且不会走到到起点距离为奇数的黑格.到起点距离为偶数的白格(删掉就行了),且不会重复走一个格子. (然后策略就同上题了,只不 ...

  7. Gym - 100548G The Problem to Slow Down You

    依然是回文树. 我们只需要吧siz[]改成统计两边的siz[][0/1],然后把两个字符中间随便加一个不会出现的字符拼起来,做一遍回文树统计一下就OJBK了 #include<bits/stdc ...

  8. 洛谷.4015.运输问题(SPFA费用流)

    题目链接 嗯..水题 洛谷这网络流二十四题的难度评价真神奇.. #include <queue> #include <cstdio> #include <cctype&g ...

  9. 2016年3月17日Android学习笔记

    1.Java.io.ByteArrayOutputStream.writeTo()方法实例 java.io.ByteArrayOutputStream.writeTo(OutputStream out ...

  10. 使用uploadify上传图片时返回“Cannot read property 'queueData' of undefined”

    在使用uploadify插件上传图片时,遇到一个比较坑的错误:上传时提示“Cannot read property 'queueData' of undefined”. 遇到这个问题有点无语,因为这个 ...