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 ...
随机推荐
- HDU 5391 Zball in Tina Town【威尔逊定理】
<题目链接> Zball in Tina Town Problem Description Tina Town is a friendly place. People there care ...
- 一步一步写数据结构(二叉树的建立和遍历,c++)
简述: 二叉树是十分重要的数据结构,主要用来存放数据,并且方便查找等操作,在很多地方有广泛的应用. 二叉树有很多种类,比如线索二叉树,二叉排序树,平衡二叉树等,本文写的是最基础最简单的二叉树. 思路: ...
- Openvas安装
Openvas简介 Openvas是开源的,是Nessus项目分支,用于管理目标系统的漏洞,检测目标网络或主机的安全性.它的评估能力来源于数万个漏洞测试程序,openvas 早起版本还有一个客户端,现 ...
- Spring Boot 入门详细分析
推荐阅读: 我们为什么要学习 Spring Boot 我们搭建 Spring Boot 项目,可以使用 Spring 为我们提供的初始化网站,那个可能不太方便,今天呢,我们就来说说如何使用 IDEA ...
- c#textBox控件限制只允许输入数字及小数点
在textboxd的事件中的 KeyPress 事件,这样双击进入代码:输入以下代码 即可 //判断按键是不是要输入的类型. || () && ( && () e.Ha ...
- 洛谷P1823 音乐会的等待
To 洛谷.1823 音乐会的等待 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或 ...
- SPOJ.Visible Lattice Points(莫比乌斯反演)
题目链接 /* http://www.spoj.com/problems/VLATTICE/ 题意:求一个n*n*n的晶体,有多少点可以在(0,0,0)处可以直接看到. 同BZOJ.2301 题目即要 ...
- 潭州课堂25班:Ph201805201 WEB 之 页面编写 第四课 登录注册 (课堂笔记)
index.html 首页 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- Ping监控脚本
需求 内网服务器之间高频率检验延时信息, 脚本特点 多进程,可同时异步监控多个地址,不会互相影响. 使用方式 创建文件夹(可以替换为你自己的,我这里就用我们生产环境的标准目录了) mkdir /dat ...
- LINUX 修改SSH默认22端口的方法
首先修改配置文件 vi /etc/ssh/sshd_config 找到#Port 22一段,这里是标识默认使用22端口,修改为如下: Port 22 Port 50000 然后保存退出 执行/etc/ ...