4 通道
4.1 CSP是什么
Go有一句经典的格言:不要通过共享内存通信,要通过通信来实现内存共享,这个是Go的并发哲学,它依赖CSP模型。
CSP 全称是“CommunicatingSequential Processes”,这也是 C.A.R Hoare 在 1978 年发表在 ACM 的一篇论文的主题。论文里指出一门编程语言应该重视 input 和 output,尤其是注重并发编程。
在那篇文章发表的时代,人们正在研究模块化编程的思想,该不该用 goto 语句在当时是最激烈的议题,彼时面向对象编程的思想正在崛起,几乎没什么人关心并发编程。在文章中,CSP 也是一门自定义的编程语言,作者定义了用于过程(process)间通信(communication)的输入输出语句,process 需要输入驱动并且产生输出供其他 process 消费,process 可以是进程、线程甚至是代码块,输入命令是“!”用来向 process 写入,输出是“?”用来从 process 读出,channel 正是借鉴了这一设计。Hoare 还提出了一个“->”命令,如果“->”左边的语句返回 false,那它右边的语句就不会执行,通过这些输入输出命令,Hoare 证明了如果一门编程语言中把过程间的通信看得第一等重要,那么并发编程的问题就会变得简单。Go 语言则进一步将 CSP 发扬光大,尽管内存同步访问控制(memory access synchronization)在某些情况下大有用处,Go 语言也有相应的 sync 包支持,但是用在大型程序中还是很容易出错,因此 Go 一开始就把 CSP 的思想融入语言的核心里,所以并发编程成为 Go 的一个独特的优势,而且很容易理解。大多数的编程语言的并发编程模型是基于线程和内存同步访问控制,Go 的并发编程的模型则用 goroutine 和 channel 来替代,goroutine 和线程类似,channel 则和 mutex(用于内存同步访问控制)类似。goroutine 解放了程序员,让他们更能贴近业务去思考问题,而不用考虑各种像线程库、线程开销、线程调度等这些烦琐的底层问题,goroutine 天生就把这些问题解决好了。channel 则天生就可以和其他 channel 组合,可以把各种收集各种子系统结果的 channel 输入到同一个 channel,channel 还可以和 select、cancel、timeout 结合起来,而 Mutex 就没有这些功能。Go 的并发原则非常优秀,目标很简单:尽量使用 channel,把 goroutine 当作免费的资源,随便使用。
4.2 通道有哪些应用
channel和goroutine的结合是Go并发编程的大杀器,而channel的实际应用也经常让人眼前一亮,通过与select,cancel,timer结合,他能实现各种各样的功能,接下来梳理一下。
1.停止信号
2.定时任务
3.解耦生产方和消费方
4.控制并发数
4.3 通道的底结构
4.3.1 数据结构

数据结构:

收发数据的本质
channel的发送和接收的本质上都是值的复制。
4.4 通道操作的情况总结


浙公网安备 33010602011771号