go 并发编程入门指南
目录
这个系列我们开始学习 Go 语言的第四个部分: 并发编程。
1. 学习内容
Go 语言的并发编程,我们学习的核心内容来自于极客时间的专栏Go 并发编程实战课,作者网名鸟窝。这个专栏在极客时间上的订阅并不多,但绝对是五星推荐。
2. 内容大纲
鸟叔的专栏设计了 5 个模块:
- 基本并发原语: 包括 Mutex,RWMutex,WaitGroup,Cond,Pool,Context,这些都是传统的并发原语在其他语言中也很常见
- 原子操作: Go 标准库提供的原子操作
- Channel: Go 语言独有的类型,是 Go 实现消息传递的核心数据结构
- 扩展并发原语: 包括信号量,SingleFlight,循环栅栏,ErrGroup
- 分布式并发原语: 使用 etcd 实现一些分布式并发原语,比如 Leader选举,分布式互斥锁,分布式读写锁,分布式队列
我们基本上会按照这样的顺序循序渐进。并发编程的核心就是解决并发编程中的资源管理问题,通常包括如下场景:
- 共享资源: 并发地读写共享资源,会出现数据竞争(data race)的问题,所以需要 Mutex、RWMutex
- 任务编排: 需要 goroutine 按照一定的规律执行,而 goroutine 之间有相互等待或者依赖的顺序关系,常常使用 WaitGroup 或者 Channel 来实现
- 消息传递: 信息交流以及不同的 goroutine 之间的线程安全的数据交流,常常使用 Channel 来实现
我们学习这些并发原语,除了要深入学习它们的实现原理,更要搞清楚它们的使用场景,这样才能做到活学活用。
注: 并发原语和同步原语往往会同时出现,但是并发原语的通常指代的范围更大,包括任务的编排,这一点需要注意。