go学习笔记_Routine和Channel下

go语言并发编程下

上文从基础层面讲解了goroutinechannel ,关于如何使用都停留下嘴皮子上,因此下篇选用几个最简单的例子来巩固下。另外推荐下自己的个人博客,你可以先点进行看下内容是否对您有帮助,在选择收藏或者直接x掉。

个人博客地址:Colourful Code

正文

首先,上文说到channel 有两种情况:

  • 未分配缓存

  • 分配一定缓存

例子从这两点入手给出。

未分配缓存
package main
import "fmt"
//求和函数sum
func sum(a []int,c chan int){
    sum :=0
    for _,v := range a{
        sum += v
    }
    c<-sum          //向通道c 写入数据值 sum
}
//主程序入口
func main(){
    a:= []int{1,3,5,2,-2}
    c:= make(chan int)
    go sum(a[:],c)      //开辟一个goroutine 用于进行sum函数执行
    x:= <-c             //读取c通道的值赋值给x
    fmt.Println(x)
}

从主程序开始分析,如下分为几个步骤:

  • 声明定义了一个数组 a

  • 声明定义了一个通道 c,注意是没有给定缓存的。

  • 正因为加了go关键字 ,所以为sum函数开辟一个goroutine,同时给函数传入参数:数组a和通道c。这个时候程序除了主routine,也就是main函数。与此同时还有为sum开辟的子routine,这个子routine所要做的就是对传入的数组进行求和,并且将结果值写入通道c中。

  • routine执行完go sum(a[:],c)这条语句之后,马上就可以执行下一条语句了。也就是 x:=<-c。 这里就有点意思了。要根据实际情况分2种情况来说:c 通道有值和无值。

    1. c 通道有值,这意味着子goroutine 中进行的求和运算先完成,通过语句c<-sum 将结果值写入通道时,由于完成的太早,没有接收方从通道读取数据造成了堵塞,子routine中的程序卡死在这里,等待接收者读取数据。直到主routine执行了x:=<-c这条语句,顺利的从通道读取到了数据,于此同时子routinec<-sum 由于通道数据被读走,这里不再堵塞,子routine中的sum函数执行完毕。
    2. c 通道没有值,意味着子goroutine 中进行的求和运算还未完成(假如这里的求和运算改为大数据处理,我想要花费很多时间。),数据还未写入到c通道中,因此由于通道内没有数据,主routine中会堵塞在 x:=<-c这条语句上,等待子routine完成数据计算,执行c<-sum语句往通道中写数据。这时候主routine中 顺利读取通道c中的值,赋值给x,打印出来。
分配缓存
package main
import "fmt"
func main(){
    c:=make(chan int,2)
    c <- 10
    c <- 20
    fmt.Println(<-c)
    fmt.Println(<-c)
}

由于理解了channel 工作机制,那么分配缓存理解起来容易一些。

  • 首先声明定义一个缓存大小为2的特定类型为int的通道c

  • 往通道写入值10,想一想,倘若没有分配缓存,那么程序会堵塞在这里,除非其他routine会从该通道读取数据,但这显然不可能,因为这时候是在主routine中,你又没有创建子routine,所以最后只会报错,“all goroutines are asleep - deadlock!”

  • 这时候你应该已经理解了,正因为分配了缓存,因此能够顺利的写入值10,接下来往通道写入值20,显然由于缓存还有空间,写入没有问题,不会造成堵塞,程序继续执行下去!

  • <-c就是从通道中读取数据,会打印10

  • 打印20,有种FIFO(注:“first in first out”,先入先出)的感觉,由于我们往通道缓存中写入值10,再写入值20,取出时就应该有顺序的先取出值10,再取出值20。

结尾:

博主是一个刚入坑的go小菜鸟,对go语言理解可能还不是很透彻,倘若哪里理解不对,或者写的有问题,欢迎指正,踩踩更健康嘛,不过希望您能留言告诉我为啥踩的理由吗,好让我改正,这也算一种学习不是吗?最后谢谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值