1 通道用做future/promise

也就是在需要异步获取某个结果作为一个函数的参数使用时的实例。

返回单向接收通道做为函数返回结果

sumSquares


将单向发送通道类型用做函数实参

sumSquareslongTimeRequest


对于上面这个特定的例子,我们可以只使用一个通道来接收回应结果,因为两个参数的作用是对等的。




2 最快回应

本用例可以看作是上例中只使用一个通道变种的增强。

有时候,一份数据可能同时从多个数据源获取。这些数据源将返回相同的数据。 因为各种因素,这些数据源的回应速度参差不一,甚至某个特定数据源的多次回应速度之间也可能相差很大。 同时从多个数据源获取一份相同的数据可以有效保障低延迟。我们只需采用最快的回应并舍弃其它较慢回应。

注意:如果有N个数据源,为了防止被舍弃的回应对应的协程永久阻塞,则传输数据用的通道必须为一个容量至少为N-1的缓冲通道。

“采用最快回应”用例还有一些其它实现方式,本文后面将会谈及。




3 对话(或称乒乓)

两个协程可以通过一个通道进行对话,整个过程宛如打乒乓球一样。 下面是一个这样的例子,它将打印出一系列斐波那契(Fibonacci)数。

4 使当前协程永久阻塞

Go中的选择机制(select)是一个非常独特的特性。它给并发编程带来了很多新的模式和技巧。

selectselectfor {time.Sleep(time.Second)}select{}
select{}

一个例子:


select{}




5 超时机制(timeout)

在一些请求/回应用例中,一个请求可能因为种种原因导致需要超出预期的时长才能得到回应,有时甚至永远得不到回应。 对于这样的情形,我们可以使用一个超时方案给请求者返回一个错误信息。 使用选择机制可以很轻松地实现这样的一个超时方案。

下面这个例子展示了如何实现一个支持超时设置的请求:

6 参考内容