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 分支就会执行。不想阻塞发送和接受时使用。

扩展阅读