Go并发编程笔记
最近尝试用Go重写之前用Python开发的一个工具,感觉一直工作于Hard模式,可是又不想轻易的放弃Golang的实践,变成遇到一些问题而从入门到放弃.
还好一周周坚持了下来,虽然遇到一个问题可能会解决多半天甚至一天多时间,还是有所学的.
今天整理下关于并发编程,也就是Go核心亮点goroutine使用中可能遇到的问题.
最佳实践
- 推荐使用WaitGroup(计数信号量)来跟踪goroutine的工作是否完成
- 写并发程序的时候,最佳做法是,在main函数返回前,清理并终止所有之前启动的goroutine
- goroutine记得return或者中断,不然容易造成goroutine占用大量CPU
- 避免“循环变量快照”
检查竞争状态: 打开 -race 命令行参数
该标记会打印产生读写冲突/数据竞争的错误及stacktrace, 避免到生产环境才发现问题. 绝对是提早排查的利器, 也算Go的优势之一 :)
该参数也可以加在test,build,run等命令, 由于生成带检测的build会消耗更多内存和CPU,建议生产环境不要部署或只部署其中一台节点.
锁住共享资源的方式
避免共享资源竞争的通用解决方式(其他语言都有的).
竞争状态是指两个或多个goroutine试图访问同一个资源.
select
- select 语句使一个goroutine 可以等待多个通信操作。
- select 会阻塞到某个分支可以继续执行为止,这时就会执行该分支
- 当 select 中的其它分支都没有准备好时,default 分支就会执行。不想阻塞发送和接受时使用。