| 语言 | 格式 | 评分 |
|---|---|---|
中文(简体) | .pdf | 3 |
| 摘要 | ||
文档是晁岳攀在Gopher China 2019上关于Go并发编程实践的演讲。内容涵盖基本同步原语(Mutex、WaitGroup、Once)、扩展同步原语(Semaphore、SingleFlight)、原子操作、Channel及内存模型。文档介绍了Mutex作为互斥锁确保临界区串行访问,WaitGroup用于等待一组goroutine完成,Once保证初始化函数只执行一次。扩展原语中,Semaphore实现信号量控制并发数,SingleFlight用于合并重复调用。文档引用了一项研究,分析Docker、Kubernetes等Go项目中171个并发bug,其中58%由消息传递引起,并提供了各项目并发原语使用占比数据。文档还讨论了happen-before原则,强调单个goroutine内读写顺序与程序定义一致,并提到了过度使用channel和goroutine的问题。 | ||
| AI总结 | ||
Go并发编程的核心是处理goroutine对共享变量的并发访问,必须通过channel或同步原语实现串行化。文档首先介绍了happen-before内存模型,用于定义事件执行顺序的偏序关系。
基本同步原语包括:Mutex(互斥锁,非重入,零值未锁,Unlock未加锁会panic)、WaitGroup(等待goroutine完成)、Once(只执行一次初始化,即使panic也认为完成)。扩展同步原语包括Semaphore(信号量,通过golang.org/x/sync/semaphore实现流量控制)和SingleFlight(合并重复请求,只执行一次函数调用)。
关于Channel和Mutex的使用建议:Channel适合传递数据所有权、分发任务、交流异步结果和任务编排;Mutex适合缓存状态和保护临界区。需避免过度使用channel和goroutine。
一项对Docker、Kubernetes等6个Go项目的171个并发bug研究发现:58%的bug由消息传递(channel)引发,共享内存(Mutex)也是主要bug来源。实际项目中Mutex使用比例最高(45%-70%),channel使用比例约18%-43%。
文档还介绍了sync.Map的使用场景:适合设置一次多次读取、多个goroutine并发读写不同key的情况,但需要注意装箱拆箱、Range遍历可能需加锁、没有Len方法等限制。 | ||
P1
P2
P3
P4
P5
P6
P7
P8
P9
P10
P11
P12
下载文档到本地,方便使用
- 可预览页数已用完,剩余
70 页请下载阅读 -
文档评分














1.6 Go并发编程实践 - 晁岳攀
Scrapy 1.6 Documentation