神刀安全网

MutexOrChannel原文翻译

原文:https://github.com/golang/go/wiki/MutexOrChannel

用sync.Mutex还是channel

go有一句格言是“用通信来共享存储,不要用共享存储来通信”。

即便如此,go还是在sync包中提供了传统的锁机制。而大多数锁的问题都可以通过channel或者传统的lock方式解决。

所以你应该用哪种方式呢?
根据场景,用最富有表达力、最简单的方式。

go新手们常犯的一个错误就是对goroutine和channel的过度使用,仅仅是因为可以这么用或者说用起来更好玩。如果用sync.Mutex能更漂亮的解决你的问题,不要害怕去使用它。go提倡的是务实,即用最适合解决你问题的方法,不要拘泥于某种编码手段。
下面给出一个通用的法则:

channel mutex
传递数据的控制权 缓存
下发任务 状态
传递异步调用结果

当你发现使用mutex规则过于复杂时,也许用channel会更适合。

Wait Group

另一个非常重要的同步手段是sync.WaitGroup。它能使协同工作的一组goroutines共同等待一个阈值事件,之后再继续独立运行。这在以下两种情况下非常有用。

首先,在cleaning up时,它可以让所有goroutine包括main goroutine在clean完成之前,都一起等待。

其次,是当一组各自独立的goroutine共同完成一个循环算法时,让这些goroutines共同等待一个临界事件,然后再次独立执行下去。这个过程可以是被重复执行的,数据在临界事件中可以被交换。这个策略是bsp的基础。

Channel、Mutex、WaitGroup互相补充,是可以被组合使用的。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » MutexOrChannel原文翻译

分享到:更多 ()