Go并发经验

记录一下go并发的实践经验

  • 当出现死锁时,考虑是否已用make将声明的chan初始化
  • 永远在不同的goroutine中发送和接收chan中的值,不要试图在main中发送并接收值
  • 如果chan无缓冲的,总是运行一个goroutine来发送或接收值,然后再在main(或其它goroutine)中接收或发送
  • 想要在main中同时收发chan中的值,考虑使用缓冲通道
  • 总是考虑两个互相收发chan之间造成的死锁问题(比如两个chan同时发送给对方,此时没有人接收),可以通过将一个发送操作放在单独的goroutine中来解决
  • 其他goroutine的阻塞完全不会影响到主goroutine
  • 考虑用close关闭chan来广播的技巧
  • 注意全局变量引起的数据竞态问题,指全局变量可能被多个goroutine同时读写(至少一个写入)。优先使用局部变量,或使用只读全局变量