golang goroutine进行通信 channel
1.channel的读取与声明
//goroutine之间利用channel进行通信
package main import (
"fmt"
"time"
) func readChan (c chan int) {
//读取通道中的内容
a := <- c
fmt.Println(a)
} func readChan2 (c chan int) {
//读取通道中的内容
a := <- c
fmt.Println(a)
} func main () {
var intChan chan int
intChan = make(chan int, 3) intChan <- 3
intChan <- 2
intChan <- 1 //通道和队列一样,先进先出
go readChan(intChan) //3 go readChan2(intChan) //2 time.Sleep(time.Second * 10)
}
channel 和队列是一样,先进先出的。
2. 带缓冲区的通道声明与通道阻塞
//通道阻塞
package main import (
"fmt"
"time"
) func write (c chan int) {
for i := 0; i < 100; i++ {
c <- i
fmt.Printf("put data %d\n", i)
}
} func read (c chan int) {
for i := 0; i < 100; i++ {
a := <- c
fmt.Println(a)
time.Sleep(time.Second)
}
} func main () {
//带缓冲区的通道,这个缓冲区的大小为10
chan01 := make(chan int, 10) //只写不读在通道达到长度10后,通道满了,会发送阻塞,不能在继续写入数据了
go write(chan01)
go read(chan01) time.Sleep(10 * time.Second)
}
输出结果为
3. 关闭通道 close(channel)
package main import (
"fmt"
) func main () {
chan01 := make(chan int, 10) for i := 0; i < 10; i++ {
chan01 <- i
} //close 关闭通道
close(chan01) //这么写会不停输出,因为读取10条后,chan01已经关闭
// for {
// b := <- chan01
// fmt.Println(b)
// } //1.使用ok来判断
// for {
// b, ok := <- chan01
// if ok == false {
// fmt.Println("chan is close")
// break
// }
// fmt.Println(b)
// } //2使用for range 遍历
for v := range chan01 {
fmt.Println(v)
}
}
关闭通道后,判断有两种方法1.参数ok来判断;2 for ...range 判断,通道关闭后会自动退出。
4. channel select 的应用
//channel select 操作
package main import (
"fmt"
"time"
) func main () {
chan01 := make(chan int, 10)
chan02 := make(chan int, 10) for i := 0; i < 10; i++ {
chan01 <- i
chan02 <- i*i
} for {
select {
case v := <- chan01:
fmt.Println(v)
case v := <- chan02:
fmt.Println(v)
default:
fmt.Println("time out")
time.Sleep(time.Second)
}
} }
golang goroutine进行通信 channel的更多相关文章
- golang goroutine的调度
golang goroutine的调度 1.什么是协程? 协程是一种用户态的轻量级线程. 2.进程.线程.协程的关系和区别: * 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度. ...
- Golang学习笔记:channel
channel channel是goroutine之间的通信机制,它可以让一个goroutine通过它给另一个goroutine发送数据,每个channel在创建的时候必须指定一个类型,指定的类型是任 ...
- go实例之轻量级线程goroutine、通道channel与select
1.goroutine线程 goroutine是一个轻量级的执行线程.假设有一个函数调用f(s),要在goroutine中调用此函数,请使用go f(s). 这个新的goroutine将与调用同时执行 ...
- Golang并发编程进程通信channel了解及简单使用
概念及作用 channel是一个数据类型,用于实现同步,用于两个协程之间交换数据.goroutine奉行通过通信来共享内存,而不是共享内存来通信.引用类型channel是CSP模式的具体实现,用于多个 ...
- golang协程——通道channel阻塞
新的一年开始了,不管今天以前发生了什么,向前看,就够了. 说到channel,就一定要说一说线程了.任何实际项目,无论大小,并发是必然存在的.并发的存在,就涉及到线程通信.在当下的开发语言中,线程通讯 ...
- [GO语言的并发之道] Goroutine调度原理&Channel详解
并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题:Go语言作为一个出道以来就自带 『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而Go ...
- 说说Golang goroutine并发那些事儿
摘要:今天我们一起盘点一下Golang并发那些事儿. Golang.Golang.Golang 真的够浪,今天我们一起盘点一下Golang并发那些事儿,准确来说是goroutine,关于多线程并发,咱 ...
- go/wiki/MutexOrChannel Golang并发:选channel还是选锁?
https://mp.weixin.qq.com/s/JcED2qgJEj8LaBckVZBhDA https://github.com/golang/go/wiki/MutexOrChannel M ...
- golang goroutine 介绍
Goroutine 是用户态自己实现的线程,调度方式遇到IO/阻塞点方式就会让出cpu时间(其实也看编译器的实现,如果TA在代码里面插入一些yield,也是可以的. 反正现在不是抢占式的.) 不能设置 ...
随机推荐
- 上传本地文件到github仓库
第一步:新建仓库 给仓库一个名字,备注 得到仓库地址: https://github.com/Lucasli2018/java-1-mybatis.git 第二步:进入要上传的文件夹,初始化上传文件夹 ...
- checkbox后台传个list显示和回显的页面代码C标签
<c:forEach items="${listtest}" var="provinces"> <input type= ...
- Qt学习大全
这边文章的目的是把自己之前写的关于Qt的文章整理归纳成一个Qt学习的专栏,会提供之前文章的导航,同时也会留一些坑待自己日后填. 1.Qt 元对象系统 2.Qt的信号和槽 3.Qt的插件开发 4.Qml ...
- Choosing a fast unique identifier (UUID) for Lucene——有时间再看下
Most search applications using Apache Lucene assign a unique id, or primary key, to each indexed doc ...
- RK3399 focaltech敦泰触摸屏移植调试
CPU:RK3399 系统:Android 7.1 IC:FT5406 focaltech(敦泰)触摸屏也是比较常用的,但是相对汇顶,就比较少用 RK的源码中虽然有 focaltech 的代码,但没有 ...
- 关于路由跟踪指令---traceroute
我们都用过ping命令来检查主机与目标地址是否连通,自己的主机与目标地址的通讯包通讯速率,所谓的通讯包也就是那些什么TCP/IP,UDP包. 原理:https://www.cnblogs.com/be ...
- 构建Hadoop监控共同体
HDFS监控背后那些事儿,构建Hadoop监控共同体 原创: 应用研发部 京东云 2018-12-19 https://mp.weixin.qq.com/s/kulwDgwu-rYf4SvQ1dOwc ...
- 007-多线程-JUC集合-Queue-BlockingQueue接口以及ArrayBlockingQueue
0.BlockingQueue接口介绍 BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利 ...
- load ifc
void setRootNode( osg::Group* root ) { m_main_view->setSceneData( root ); if( m_hud_camera ) { ro ...
- labelimg data
<annotation> <folder>img_data_box_1500</folder> <filename>798.jpg</filena ...