开发 go 程序的时候,时常需要使用 goroutine 并发处理任务,有时候这些 goroutine 是相互独立的,需要保证并发的数据安全性,也有的时候,goroutine 之间要进行同步与通信,主 goroutine 需要控制它所属的子goroutine。前者并发数据安全依赖锁机制和原子操作,包括互斥锁 sync.Mutex,读写锁 sync.RWMutex,原子操作sync/atomic等,后者涉及到并发行为控制,并发行为控制有三种常见的方式,分别是 WaitGroup,Channel,Context。
1.数据安全性控制(data race)
- 互斥锁 sync.Mutex
- 读写锁 sync.RWMutex
- 原子操作 sync/atomic
2.并发 gorutine 行为控制
- sync.WaitGroup(等待所有 goroutine 全部结束)
- channel(可以用有缓冲队列控制 goroutine 的数量,可以用 channel+select 实现 goroutine 间的消息通知)
- Context(web 场景中,树状的调用结构下,各 goroutine 间消息同步(退出、超时等),父 context 通知所有子 context)