golang channel select
尝试多个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的更多相关文章
- golang的select实现原理剖析
写在最前面 select为golang提供了多路IO复用机制,和其他IO复用一样,用于检测是否有读写事件是否ready. 本文将介绍一下golang的select的用法和实现原理. 实现原理 gola ...
- golang的select典型用法
golang 的 select 的功能和 select, poll, epoll 相似, 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作. 示例: ch1 := make (chan in ...
- golang关键字select的三个例子, time.After模拟socket/心跳超时
golang关键字select的三个例子, time.After模拟socket/心跳超时 例子1 select会随机选择一个可执行的case // 这个例子主要说明select是随机选择一个 ...
- golang开发:select多路选择
select 是 Golang 中的一个控制结构,语法上类似于switch 语句,只不过select是用于 goroutine 间通信的 ,每个 case 必须是一个通信操作,要么是发送要么是接收,s ...
- golang channel原理
channel介绍 channel一个类型管道,通过它可以在goroutine之间发送和接收消息.它是Golang在语言层面提供的goroutine间的通信方式. 众所周知,Go依赖于称为CSP(Co ...
- golang channel的使用以及调度原理
golang channel的使用以及调度原理 为了并发的goroutines之间的通讯,golang使用了管道channel. 可以通过一个goroutines向channel发送数据,然后从另一个 ...
- 【转】关于 Goroutine Channel Select 的用法和理解
原文:https://blog.csdn.net/jfkidear/article/details/88661693 ----------------------------------------- ...
- golang channel关闭后,是否可以读取剩余的数据
golang channel关闭后,其中剩余的数据,是可以继续读取的. 请看下面的测试例子. 创建一个带有缓冲的channel,向channel中发送数据,然后关闭channel,最后,从channe ...
- Golang的select多路复用以及channel使用实践
看到有个例子实现了一个类似于核弹发射装置,在发射之前还是需要随时能输入终止发射. 这里就可以用到cahnnel 配合select 实现多路复用. select的写法用法有点像switch.但是和swi ...
随机推荐
- bochs配置文件解释说明
############################################### # Configuration file for Bochs ##################### ...
- 《Gradle权威指南》--Android Gradle测试
No1: Android既可以用传统的JUnit测试,也可以用Android的instrument测试. No2: 当我们运行测试的时候,androidTest SourceSet会被构建成一个可以安 ...
- 蓝牙扫描工具btscanner修复暴力扫描模式
蓝牙扫描工具btscanner修复暴力扫描模式 在btscanner 2.1-5版本中,当用户按下快捷键b,执行暴力扫描模式,会出现程序奔溃问题.该问题现在已经修复.用户只需要更新系统,将btsc ...
- AGC 027C.ABland Yard(拓扑/二分图)
题目链接 \(Description\) 给定一张图(可能存在自环),每个点上有A或B.求是否存在一条路径,使得在上面不断走,能够得到所有AB串组合(可以重复经过点). \(n\leq2\times1 ...
- Python图形编程探索系列-05-用控制变量构建对话程序
跳转到自己的博客 控制变量 变量 符号 意义 默认值 1 var = tk.BooleanVar() 布尔型 0 2 var = tk.StringVar() 字符串控制变量 空字符串 3 var = ...
- Eclipse 重构
使用重构工具可以快捷地将代码变成整洁而高度模块化的代码. Rename Rename 是 Eclipse 中最常用的重构.利用这个重构,可以对变量.类.方法.包.文件夹及几乎任何的 Java 标识符进 ...
- C++.Linux下redis编程:error while loading shared libraries: libhiredis.so.0.13
编译 sudo gcc -o sltest01 sltest01.c -L/usr/local/lib/ -lhiredis 运行 sudo ./sltest01 编译成功后运行报错信息: ./slt ...
- Shutting down CodePlex 03/31/2017
Almost 11 years after we created CodePlex, it’s time to say goodbye. We launched CodePlex in 2006 b ...
- Date与Quartz的cron之间的相互转换
1.概述 最近在写一个Quartz相关的模块,需要实现Date与Quartz的cron之间的相互转换,在网上查了一下竟然没有找到,但是找到一份这样的博客:http://hw1287789687.ite ...
- electron实现类似QQ来新消息时的闪烁与任务栏窗口提醒
公司项目有一款带即时聊天.群组功能的APP,因为要给客服人员使用,需要开发PC版本.之前使用C#开发过一个PC版本,但是C#的UI这一块支持的不太好,而且升级比较麻烦,我就牵头基于Electron去实 ...