Golang channel

栏目: Go · 发布时间: 7年前

内容简介:本文介绍golang的channel的基础知识和一些经典的应用范式.按这个标准channel可以分为两个大类:带缓冲(buffered)的channel和不带缓冲(unbuffered)的channel. 定义一个不带缓的channel下面这段代码会输出什么?

本文介绍golang的channel的基础知识和一些经典的应用范式.

channel 基础

channel分类

  • buffered/unbuffered channel

按这个标准channel可以分为两个大类:带缓冲(buffered)的channel和不带缓冲(unbuffered)的channel. 定义一个不带缓的channel

var ch = make(chan bool)

下面这段代码会输出什么?

package main

func main(){
  ch :=make(chan int)
  ch <-10
  go task(ch)
}
func task(ch chan int){
   <- ch
}

答案是会死锁。因为unbuffered channel在写入数据之前需要有接收channle数据的goroutine做好准备。需要对上面代码做如下修改:

package main

func main(){
  ch :=make(chan int)
  go task(ch)
  ch <-10
}
func task(ch chan int){
   <- ch
}

带有缓冲的channel

var ch = make(chan bool, 3)
  • unidirectoinal/bidirectional channel

定义一个双向(bidirectional)channel

var ch = make(chan bool)

双向的意思是可以在channel上读或者写. 定义一个单向只读channel

var ch = make(<- chan bool)

定义一个单向只写channel

var ch = make(chan <- bool)

channel的状态

对处于不同状态的channel的读写操作会有不同的结果

  • nil

对nil状态的channel读写都会被阻塞,造成死锁。

  • open

对正常open状态的channel可以进行正常读写。

  • closed

往closed状态的channel写数据会造成panic,但是读取不会造成panic,会得到channel类型的零值。

channel的实现原理

实现channel的关键数据结构

type hchan struct {
    qcount   uint           // total data in the queue
    dataqsiz uint           // size of the circular queue
    buf      unsafe.Pointer // points to an array of dataqsiz elements
    elemsize uint16
    closed   uint32
    elemtype *_type // element type
    sendx    uint   // send index
    recvx    uint   // receive index
    recvq    waitq  // list of recv waiters
    sendq    waitq  // list of send waiters

    // lock protects all fields in hchan, as well as several
    // fields in sudogs blocked on this channel.
    //
    // Do not change another G's status while holding this lock
    // (in particular, do not ready a G), as this can deadlock
    // with stack shrinking.
    lock mutex
}

channel里包含一个环形队列,用于将goroutine发送的数据保存到队列中。另外 recvqsendq 队列用于保存阻塞在读和写操作的goroutine. 当channel中有数据可读或可写时,调度器唤醒阻塞在相应队列中的goroutine.

channle常用的应用范式

  1. 生产者消费者模式
  2. 一对多和多对一的通知
  3. 互斥锁
  4. ratelimiting
  5. 限制并发数
  6. 配合select超时控制

参考链接


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

颠覆营销

颠覆营销

陈杰豪、车品觉 / 中信出版社 / 2016-2 / 49.00元

对于大数据未来趋势的判断 车品觉 光阴荏苒,2015年在跌跌荡荡中成了过去式,对于大数据的产业来说过去这一年冒出了很多新的名词。但在我看来,真正的大数据应用和市场才刚刚开始萌芽,所以我希望大家先认清一个关键,那就是所有的数据都是基于应用而产生,而数据经过釆集及整合后又再落实到自身或其他应用情境中,大数据的创新价值可以来自新连接的数据、算法或者产品本身。 过去两年大数据的成长和智能......一起来看看 《颠覆营销》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具