深入理解Go Channel

本文探讨了Golang中的Channel在并发和同步中的核心作用,以及如何通过Goroutine实现CSP模型。通过分析Go Channels的内部机制,包括make chan、发送与接收过程、Goroutine的暂停与恢复,阐述了Channel如何实现goroutine安全、存储和传输值、FIFO语义以及阻塞/解阻塞功能。同时,文章通过实例展示了Channel的工作原理,包括sendq和recvq列表的使用,以及数据如何在Goroutines之间通过copy方式安全通信。
摘要由CSDN通过智能技术生成

Golang使用Groutine和channels实现了CSP(Communicating Sequential Processes)模型,channles在goroutine的通信和同步中承担着重要的角色。在GopherCon 2017中,Golang专家Kavya深入介绍了 Go Channels 的内部机制,以及运行时调度器和内存管理系统是如何支持Channel的,本文根据Kavya的ppt学习和分析一下go channels的原理,希望能够对以后正确高效使用golang的并发带来一些启发。

以一个简单的channel应用开始,使用goroutine和channel实现一个任务队列,并行处理多个任务。

func main(){
    //带缓冲的channel
    ch := make(chan Task, 3)

    //启动固定数量的worker
    for i := 0; i< numWorkers; i++ {
        go worker(ch)
    }

    //发送任务给worker
    hellaTasks := getTaks()

    for _, task := range hellaTasks {
        ch <- task
    }

    ...
}

func worker(ch chan Task){
    for {
       //接受任务
       task := <- ch
       process(task)
    }
}

从上面的代码可以看出,使用golang的goroutine和channel可以很容易的实现一个生产者-消费者模式的任务队列,相比java, c++简洁了很多。channel可以天然的实现了下面四个特性:
- goroutine安全
- 在不同的goroutine之间存储和传输值
- 提供FIFO语义(buffered channel提供)
- 可以让goroutine block/unblock

那么channel是怎么实

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值