文本描述
2020/11/15 13 | Channel:另辟蹊径,解决并发问题 下载APP 13 | Channel:另辟蹊径,解决并发问题 2020-11-09 晁岳攀 Go 并发编程实战课 进入课程 讲述:安晓辉 时长 26:07 大小 23.92M 你好,我是鸟窝。 Channel 是 Go 语言内建的 first-class 类型,也是 Go 语言与众不同的特性之一。Go 语 言的 Channel 设计精巧简单,以至于也有人用其它语言编写了类似 Go 风格的 Channel 库,比如docker/libchan、tylertreat/chan,但是并不像 Go 语言一样把 Channel 内 置到了语言规范中。从这一点,你也可以看出来,Channel 的地位在编程语言中的地位之 高,比较罕见。 所以,这节课,我们就来学习下 Channel。 Channel 的发展 time.geekbang.org/column/article/304188 1/26 2020/11/15 13 | Channel:另辟蹊径,解决并发问题 要想了解 Channel 这种 Go 编程语言中的特有的数据结构,我们要追溯到 CSP 模型,学 习一下它的历史,以及它对 Go 创始人设计 Channel 类型的影响。 CSP 是 Communicating Sequential Process 的简称,中文直译为通信顺序进程,或者叫 做交换信息的循序进程,是用来描述并发系统中进行交互的一种模式。 CSP 最早出现于计算机科学家 Tony Hoare 在 1978 年发表的论文中(你可能不熟悉 Tony Hoare 这个名字,但是你一定很熟悉排序算法中的 Quicksort 算法,他就是 Quicksort 算法的作者,图灵奖的获得者)。最初,论文中提出的 CSP 版本在本质上不是 一种进程演算,而是一种并发编程语言,但之后又经过了一系列的改进,最终发展并精炼 出 CSP 的理论。CSP 允许使用进程组件来描述系统,它们独立运行,并且只通过消息传递 的方式通信。 就像 Go 的创始人之一 Rob Pike 所说的:“每一个计算机程序员都应该读一读 Tony Hoare 1978 年的关于 CSP 的论文。”他和 Ken Thompson 在设计 Go 语言的时候也深 受此论文的影响,并将 CSP 理论真正应用于语言本身(Russ Cox 专门写了一篇文章记录 这个历史),通过引入 Channel 这个新的类型,来实现 CSP 的思想。 Channel 类型是 Go 语言内置的类型,你无需引入某个包,就能使用它。虽然 Go 也提供 了传统的并发原语,但是它们都是通过库的方式提供的,你必须要引入 sync 包或者 atomic 包才能使用它们,而 Channel 就不一样了,它是内置类型,使用起来非常方便。 Channel 和 Go 的另一个独特的特性 goroutine 一起为并发编程提供了优雅的、便利的、 与传统并发控制不同的方案,并演化出很多并发模式。接下来,我们就来看一看 Channel 的应用场景。 Channel 的应用场景 首先,我想先带你看一条 Go 语言中流传很广的谚语: Don’t communicate by sharing memory, share memory by communicating. Go Proverbs by Rob Pike time.geekbang.org/column/article/304188 2/26 2020/11/15 13 | Channel:另辟蹊径,解决并发问题 这是 Rob Pike 在 2015 年的一