Channel是Go中的一种类型,和goroutine一起为Go提供了并发技术, 它在开发中得到了广泛的应用。Go鼓励人们通过Channel在goroutine之间传递数据的引用(就像把数据的owner从一个goroutine传递给另外一个goroutine), Effective Go总结了这么一句话:
Do not communicate by sharing memory; instead, share memory by communicating.
在 Go内存模型指出了channel作为并发控制的一个特性:
A send on a channel happens before the corresponding receive from that channel completes. (Golang Spec)
除了正常的在goroutine之间安全地传递共享数据, Channel还可以玩出很多的花样(模式), 本文列举了一些channel的应用模式。
促成本文诞生的因素主要包括:
- eapache的channels库
- concurrency in go 这本书
- Francesc Campoy的 justforfun系列中关于merge channel的实现
- 我在出版Scala集合手册这本书中对Scala集合的启发
下面就让我们以实例的方式看看这么模式吧。
