关于go 的chan 的特性 (队列 ,广播 ,阻塞 ,非阻塞 ,缓存)

序言

如果对go 的chan 不了解 ,请先看菜鸟教程

chan 通道的队列特性

定义通道 : var 通道A chan int
插入通道 : 通道A<- 输入值
先进先出 : 取出值 <-通道A

chan 通道的广播特性

利用chan 的关闭功能实现 广播

func t1(线程名 string) {
	//通道关闭的影响
	for {
		取出值, 开通 := <-ch
		if !开通 {
			fmt.Println("通道已关闭")
			break
		}
		fmt.Println( 线程名 , 取出值)
		core.Sleeps(2)
	}
}

....
	ch = make(chan int, 8)
	go t1("线程1")
	go t1("线程2")
	go t1("线程3")
	close(ch)  

close() 函数可以触发所有的多线程响应关闭事件

chan 通道的阻塞与非阻塞特性

利用 通道的读特性( <- )实现阻塞

g:= <-通道变量
...后续代码块

只要通道中没有值,后续代码就无法执行, 这样就实现了阻塞

利用 通道的选择特性( select )实现非阻塞

select {
case <-通道1
 ....代码块1
default 
....代码块2
}
...代码块3

虽然这里用到了通道的读特性,但因为外层包裹了 select{}
所以 即使 通道1 无法取出 值,
依然可以执行 default 后的代码块2,和后续的代码块3
也就实现了非阻塞

利用通道的写缓存实现非阻塞

var c1 chan int= make(chan int, 10)
....
c1 <9
....代码块1

如果c1 通道没有满 , 代码块1 可以被执行
如果c1 通道满了 ,那么9无法插入 ,代码块1也无法执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值