Go圣经-学习笔记之select多路复用


声明:本文转载自https://my.oschina.net/u/3287304/blog/1557792,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

上一篇 Go圣经-学习笔记之并发循环

select多路复用

这个概念与socket网络编程中的select、poll和epoll中的select概念类似。其含义是有N个channel,只要有一个channel上有数据产生,select就会立即监听到,然后接收数据,处理数据,如果有多个channel队列上都有数据流,则随机选取一个channel;如果N个channel上都没有数据流,则一直发生阻塞。例如, 火箭既可以倒计时发射,也可以在倒计时期间取消发射:

// 倒计时 func countdown(count chan struct{}) {     tick:=time.Tick(1*time.Second)     for i:=10; i>0; i-- {         fmt.Printf("countdown: %d\n", i)         <-tick     }     count<-struct{}{}     return } // 中断发射 func abort(ach chan struct{}) {     os.Stdin.Read(make([]byte, 1))     ach<- struct{}{}     return }  func main() {     var count = make(chan struct{})     var ach = make(chan struct{})     go countdown(count)     go abort(ach)     select {         case <-count:             launch()         case <-ach:             fmt.Println("abort launch...")     }     return } 

也可以使用time.After(10*time.Second), 也表示10s后发射。这个例子其实有goroutine泄露,因为tick所在的发送端是一个未知的goroutine,它会每隔1s会向tick channel发送一个数据。程序结束时,也没有关闭goroutine。除非是程序隐式地做。

// 一个更友善的方法: ticker := time.NewTimer(1*time.Second) <-ticker.C ticker.Stop() // 它会触发timer的goroutine主动退出 

在使用select时,经常用到的一个场景就是web服务处理请求,如果一个请求处理的时间过长或者负载过高导致的处理时间过长,它会拖慢整个服务端性能,这时候应该尽早让处理时间过长的请求去释放资源。

select {     case <-ch1:         // ch1所在的发送端goroutine正在处理请求     case <-time.After(2*time.Second):         // 释放资源,返回请求处理失败的数据,或者先通知用户已处理成功,最终一致性可以保证。         // 最重要的是快速响应,免得用户看着页面没反应,过多的点击按钮发送请求,会过多消耗服务端的系统资源 } 

面试题select

ch := make(chan int, 1) for i := 0; i < 10; i++ {     select {     case x := <-ch:         fmt.Println(x)      case ch <- i:     } } 

问输出结果是什么?

结果:"0" "2" "4" "6" "8", 因为select多路复用中的两个channel其实是同一个,一个用来发送,一个用来接收。所以每当执行ch<-i都是跳跃的,所以每次往ch中发送数据都是偶数了。

本文发表于2017年10月29日 12:34
(c)注:本文转载自https://my.oschina.net/u/3287304/blog/1557792,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1806 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1