今天在【Go夜读#Channel】的视频,感觉这个视频很长,两个小时,然后比较模糊,听不明白,可能是自己读源码的基础不够吧。不过前面的可视化版本还是不错的

把hchan的属性可视化到下面这种,看起来就很好理解

后面读源码的第二部分就看得云里雾里了,只好去网上找其他博客来看,下面这篇还不错

http://legendtkl.com/2017/08/06/golang-channel-implement/

大概总结一下:

1、创建channel的时候,要注意的就是如果是  chan(interface{},4) 这种有buffer的channel 的话,那4个channle是一次性申请空间的,好像上面那篇博客讲的时候,还是go1.9,那个时候还是分开申请的,现在已经连续申请了

2、如果是写入的话

      先看接受队列有没有人等,如果有,先给接受队列里面的(直接跳过往buffer里面放数据)

      如果没有,再看buffer里面是否还可以放得下,如果放得下就放下

      如果buffer里面放不下,就阻塞

3、如果是读取的话,就跟写入是相反的

     先看生产队列有没有人生产好了,如果有,直接读取这个(跳过buffer)

     如果没有,再看buffer里面是否有,读取

     如果buffer里面也没有,阻塞

4、关闭channel的话,注意的点就是要唤醒生产队列和消费队列里面的阻塞groutine

      直接把两个队列全部放到临时队列(gList)中,然后马上释放锁(因为持有锁的代价昂贵),然后再唤醒gList里面的groutine

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐