golang channel

无缓冲通道

无缓冲的channel,不能再一个协程

在这里插入图片描述

有缓冲通道

在这里插入图片描述

有缓冲区,可以在一个协程
在这里插入图片描述

接收值方法

方法1:common ok方法,当缓冲区没有值是ok=false,i=0
在这里插入图片描述

方法2:for range遍历,当没有值可读时会阻塞
在这里插入图片描述

单向通道

有的时候我们会将通道作为参数在多个任务函数间传递,很多时候我们在不同的任务函数中使用通道都会对其进行限制,比如限制通道在函数中只能发送或只能接收。

Go语言中提供了单向通道来处理这种情况。例如,我们把上面的例子改造如下:
在这里插入图片描述

传参时在申明ch是加上数据流向"<-"
ch<- int 只能写入不能读取
ch<- int 只能读取不能写入

channel实现workpool

在工作中我们通常会使用可以指定启动的goroutine数量–worker pool模式,控制goroutine的数量,防止goroutine泄漏和暴涨。

一个简易的work pool示例代码如下:

5个任务有三个goroutine去执行

在这里插入图片描述
id–goroutine id
jobs–任务队列,goroutine去里面拿任务

在这里插入图片描述
job—任务队列,有多少任务

worker—工作队列,

select多路复用

select的使用类似于switch语句,它有一系列case分支和一个默认的分支。每个case会对应一个通道的通信(接收或发送)过程。select会一直等待,直到某个case的通信操作完成时,就会执行case分支对应的语句。具体格式如下:

select{
    case <-ch1:
        ...
    case data := <-ch2:
        ...
    case ch3<-data:
        ...
    default:
        默认操作
}

在这里插入图片描述
分析:
第一次循环i=0,第一个case分支不成立,只能执行第二个case,把0放到ch
第二次循环i=1,第一个case成立,把ch里面的0取出来
。。。

输出:

在这里插入图片描述
总结:

  • 可处理一个或多个channel的发送/接收操作。
  • 如果多个case同时满足,select会随机选择一个。
  • 对于没有case的select{}会一直等待,可用于阻塞main函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值