golang的缓冲channel简单使用
golang的缓冲channel简单使用
我们常用的是无缓冲channel :
make(chan type)
其实make() 创建chan的第二个参数可设置缓冲channel的大小。
上述语句等价于 make(chan type, 1) 即创建了一个缓冲区大小为1channel
下面看有缓冲channel的两个例子.
阻塞型
demo :
协程1 :每隔1s 往有10个缓冲的channel里面写一条msg,
协程2:每隔3s 取一条msg,
package main
import(
//"fmt"
"time"
"strconv"
log "github.com/astaxie/beego/logs"
)
func main() {
log.Debug("---main--- start")
msgs := make(chan string, 10)
i := 0
go func() {
time.Sleep(3*time.Second)
for {
time.Sleep(1*time.Second)
i++
msg := "msg " + strconv.Itoa(i)
msgs <- msg
log.Debug("------ put msg : ", msg)
}
}()
go func() {
for {
get := <- msgs
log.Debug("---------------- pop msg : ", get)
time.Sleep(3*time.Second)
}
}()
time.Sleep(100*time.Second)
}
可以看到当缓冲区满了以后,写channel的操作会阻塞在那里等待读端取走msg后才能写入。

非阻塞
实际场景中我们可能不希望程序阻塞,那么可以使用select来控制,当缓冲区满了后忽略该条msg继续执行我们的程序。
package main
import(
//"fmt"
"time"
"strconv"
log "github.com/astaxie/beego/logs"
)
func main() {
log.Debug("---main--- start")
msgs := make(chan string, 3)
i := 0
go func() {
time.Sleep(3*time.Second)
for {
time.Sleep(1*time.Second)
i++
msg := "msg " + strconv.Itoa(i)
select {
case msgs <- msg:
log.Debug("------ put msg : ", msg)
default :
log.Debug("-----msgs chan cache full sleep 1s-----")
log.Debug("-----ignore this msg-----> : ", msg)
}
}
}()
go func() {
for {
get := <- msgs
log.Debug("---------------- pop msg : ", get)
time.Sleep(3*time.Second)
}
}()
time.Sleep(100*time.Second)
}
可以看到,因为写端写入过快,再写入msg6时缓冲区已满,执行default丢弃了msg6,读端在取走msg5后, 取走的不是msg6,而是msg7

golang的缓冲channel简单使用的更多相关文章
- golang 无缓冲channel
golang 无缓冲channel package main import "fmt" func main() { // 1S =1000ms //1ms = 1000us //1 ...
- golang的缓冲channel和无缓冲channel的区别
话说golang的channel同步的定义真是让人无力吐槽,码农的用户体验就这么难搞么,超耐磨阿,无缓冲和缓冲居然有这么大区别....靠 转载一段网上的资料 --------------------- ...
- go之无缓冲channel(通道)和有缓冲channel(通道)
channel我们先来看一下通道的解释:channel是Go语言中的一个核心类型,可以把它看成管道.并发核心单元通过它就可以发送或者接收数据进行通讯,这在一定程度上又进一步降低了编程的难度.chann ...
- go语言之进阶篇有缓冲channel
1.有缓冲channel 示例: 有缓存会阻塞,当读取完其中数值时,又可以写入. package main import ( "fmt" "time" ) f ...
- go语言之进阶篇无缓冲channel
1.无缓冲channel 示例: package main import ( "fmt" "time" ) func main() { //创建一个无缓存的ch ...
- Go语言中的有缓冲channel和无缓冲channel区别
Go语言中的有缓冲channel和无缓冲channel区别 结论 ch1:=make(chan int)// 无缓冲 ch2:=make(chan int,1)// 有缓冲 无缓冲: 当向ch1中存值 ...
- golang 如何查看channel通道中未读数据的长度
可以通过内建函数len查看channel中元素的个数. 内建函数len的定义如下: func len(v Type) int The len built-in function returns the ...
- Golang(九)简单 Goroutine 池实现
0. 前言 最近使用 Golang 写一个并发执行的测试脚本 之前习惯使用 Java,习惯性想先建一个线程池.然后意识到 Golang 没有封装好的线程池 结合之前学习的 Goroutine 原理和 ...
- Golang 绘图基础 -绘制简单图形
前一节讲的是 绘图到不同输出源,请看地址: http://www.cnblogs.com/ghj1976/p/3440856.html 上一节的例子效果是通过设置每一个点的的RGBA属性来实现的,这是 ...
随机推荐
- 基于ASP.NET Core 3.0快速搭建Razor Pages Web应用
前言 虽然说学习新的开发框架是一项巨大的投资,但是作为一个开发人员,不断学习新的技术并快速上手是我们应该掌握的技能,甚至是一个.NET Framework开发人员,学习.NET Core 新框架可以更 ...
- luogu P3913 车的攻击 |数学
题目描述 N×N 的国际象棋棋盘上有KK 个车,第ii个车位于第R_i行,第C_i列.求至少被一个车攻击的格子数量. 车可以攻击所有同一行或者同一列的地方. 输入格式 第1 行,2 个整数N,K. 接 ...
- CodeForces-Round524 A~D
A. Petya and Origami time limit per test 1 second memory limit per test 256 megabytes input stan ...
- ARTS-S docker ceontos镜像中使用crontab
centos镜像中默认没有crontab,需要在dockerflle中通过yum的安装 yum -y install vixie-cron crontabs && yum clean ...
- HtmlAgilityPack 获取节点的子节点
这个问题真的是好无语 var table = doc.DocumentNode.SelectSingleNode("//table[@class='ddd']"); var a = ...
- Docker--DockerFile创建自己的image
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 在我们 ...
- rails gem ransack 之模糊搜索
gem 'ransack' eq: "等于" eq_any: "等于任意值" eq_all: "等于所有值" not_eq: "不 ...
- JS实现链式调用 a().b().c()
function a() { this.b = function () { console.log('111') return this } this.c = function () { consol ...
- CentOS 7.4搭建LAMP,LAMP:Linux、Apache、MySQL、PHP
CentOS 7.4搭建LAMP,LAMP:Linux.Apache.MySQL.PHP. 目录: 第一部分 准备工作 第二部分 安装Apache服务 第三部分 安装MySQL服务 第四部分 搭建PH ...
- 【RabbitMQ】显示耗时处理进度
[RabbitMQ]显示耗时处理进度 通过网页提交一个耗时的请求,然后启动处理线程,请求返回.处理线程每完成一部分就给前台推送完成的数量,前端显示进度. 依赖jar <?xml version= ...