教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 深入理解channel:设计 源码

深入理解channel:设计 源码

发布时间:2023-02-22   编辑:jiaochengji.com
教程集为您提供深入理解channel:设计 源码等资源,欢迎您收藏本站,我们将为您提供最新的深入理解channel:设计 源码资源

channel是大家在Go中用的最频繁的特性,也是Go最自豪的特性之一,你有没有思考过:

  • Why:为什么要设计channel?
  • What:channel是什么样的?
  • How:channel是如何实现的?

这篇文章,就来回答这3个问题。

channel解决什么问题?

在Golang诞生之前,各编程语言都使用多线程进行编程,但多线程复杂、混乱、难以管理,对开发者并不是多么友好。

Golang是Google为了解决高并发搜索而设计的,它们想使用简单的方式,高效解决并发问题,最后做成了,然后又把Golang开源了出来,以及到处推广,所以Golang自从诞生之初,就风风火火。

从Golang文档中,我们可以知道,为啥Golang设计了channel,以及channel解决了什么问题?

Go Concurrency Patterns:

Concurrency is the key to designing high performance network services. Go's concurrency primitives (goroutines and channels) provide a simple and efficient means of expressing concurrent execution. In this talk we see how tricky concurrency problems can be solved gracefully with simple Go code.

Golang使用goroutinechannel简单、高效的解决并发问题,channel解决的是goroutine之间的通信

channel是怎么设计的?

我们以为channel是一个通道:

实际上,channel的内在是这样的:

channel设计涉及的数据结构很简单:

  • 基于数组的循环队列,有缓冲的channel用它暂存数据
  • 基于链表的单向队列,用于保存阻塞在此channel上的goroutine

我本来想自己码一篇channel的设计文章,但已经有大牛:Kavya深入分析了Channel的设计,我也相信自己写的肯定不如他好,所以我把Kavya在Gopher Con上的PPT推荐给你,如果你希望成为Go大牛,你一定要读一下,现在请收藏好

Kavya在Gopher Con上的演讲主题是:理解channel,他并不是教你如何使用channel,而是把channel的设计和goroutine的调度结合起来,从内在方式向你介绍。这份PPT足足有80页,包含了大量的动画,非常容易理解,你会了解到:

  • channel的创建
  • 各种场景的发送和接收
  • goroutine的调度
  • goroutine的阻塞和唤醒
  • channel和goroutine在select操作下

Kavya的PPT应该包含了channel的80%的设计思想,但也有一些缺失,需要你阅读源码:

  • channel关闭时,gorontine的处理
  • 创建channel时,不同的创建方法
  • 读channel时的非阻塞操作
  • ...

PPT在此:Understanding Channels,如果你有心,还可以在这个网站看到Kavya关于goroutine调度的PPT,福利哦

您可能感兴趣的文章:
【文末有惊喜!】一文读懂golang channel
golang goroutine 通知_深入golang之---goroutine并发控制与通信
golang知识点
channel实战应用,这篇就够了!
图解 Go 并发编程
一文读透GO语言的通道
Golang 中的 Goroutine 调度原理与 Chanel 通信
深入理解Golang之Context(可用于实现超时机制)
jQuery源码分析系列
Golang-Channel原理解析

[关闭]
~ ~