Select选择
Go的select语句允许同时等待多个通道操作。将协程和channels与select结合是Go的一个强大功能。
下面的示例中,将对两个通道进行选择。每个通道将在一段时间后收到一个值,以模拟在并发协程中执行的阻塞的RPC操作。我们将使用select同时等待这两个值,每次到达时都打印,结果会收到预期的one和two。请注意,总执行时间仅为~2秒,因为当前1秒和2秒各自的休眠是并发执行的。
结果:
$ time go run select.go
received one
received two
real 0m2.245s
Timeout超时
对于连接到外部资源或需要限制执行时间的程序,超时非常重要。基于channels通道和select语句,在Go中实现超时既简单又优雅。
如下所示,主协程执行一个调用,该调用2s后在通道c1上返回其结果。注意,通道是缓冲的,因此协程中的数据发送是非阻塞的。这是通道的一种常见的使用模式,用于防止在永远不读取通道的情况下发生协程泄漏。
使用slect来实现超时的处理情况。语法res:=<-c1等待结果,语法<-time.Aftet设置为1s后发送一个值。由于select中第一个接收器在持续地等待,因此,当等待花费的时间超过1s,selec将采用超时的case的处理。如果把超时设置为3s,则从c2接收值将成功,并打印结果。运行此程序的结果将显示第一个操作超时和第二个操作成功。
结果:
$ go run timeouts.go
timeout 1
result 2