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属性来实现的,这是 ...
随机推荐
- PHP命令空间namespace及use的用法
使用namespace的目的 命名空间将代码划分出不同的空间(区域),每个空间的常量.函数.类(为了偷懒,我下边都将它们称为元素)的名字互不影响, 这个有点类似我们常常提到的'封装'的概念. 团队合作 ...
- PHP连接XMPP用户,聊天室 进行增删改查。
1.到http://www.igniterealtime.org/projects/openfire/plugins.jsp下载一个插件REST API. 这个插件的作用就是允许程序设计师通过http ...
- 一统江湖的大前端(8)- velocity.js 运动的姿势(上)
[摘要] 介绍CSS动画和JS动画的基本特点,以及轻量级动画库velocity.js的基本用法. 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园 ...
- redis位图巧用,节约内存
最近要做一个圣诞抽奖活动,需要记录每天用户签到的记录,以前一般都是用普通的字符串数据类型,每个用户的签到用一个 key // 用户10在活动第一天的签到key为record:1:10 $key = & ...
- cenos基本信息和ssh
一.查看cenos相关信息 1.查看cpu more /proc/cpuinfo grep "model name" grep "model name ...
- SpringMVC实现上传下载功能
配置资源(jar包) 将前端页面整理好: 写核心的几个配置文件(applicationContext+wed.xml+jdbc.properties+log4j+springMVC.xml) 都是在s ...
- JS-常考算法题解析
常考算法题解析 这一章节依托于上一章节的内容,毕竟了解了数据结构我们才能写出更好的算法. 对于大部分公司的面试来说,排序的内容已经足以应付了,由此为了更好的符合大众需求,排序的内容是最多的.当然如果你 ...
- 使用CleanWebpackPlugin插件报错原因:CleanWebpackPlugin is not a constructor
// webpack版本:4.32.2 // 抛错原写法 const CleanWebpackPlugin = require("clean-webpack-plugin"); . ...
- 使用if判断字符串的长度是否等于10,根据结果进行不同的输出
string1=' print(len(string1)) # 使用len()计算字符串长度 if not len(string1) ==10: print('字符串的长度不为10') else: p ...
- CentOS6和CentOS7进入单用户模式重置root密码
一.前言 如果在Linux系统下root密码丢失或者需要破解物理机器用户密码,可以通过进入系统单用户模式进行重置root密码.本文介绍CentOS6和CentOS7两个系统版本进行root密码重置. ...