搜索

pdf文档 1.6 Go并发编程实践 - 晁岳攀

16.62 MB 82 页 0 下载 6 浏览 0 评论 0 收藏
所属分类: 后端开发 / Go
语言 格式 评分
中文(简体)
.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 页请下载阅读 -
文档评分
请文明评论,理性发言.