博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go圣经-学习笔记之select多路复用
阅读量:6216 次
发布时间:2019-06-21

本文共 1611 字,大约阅读时间需要 5 分钟。

hot3.png

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.Cticker.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中发送数据都是偶数了。

转载于:https://my.oschina.net/u/3287304/blog/1557792

你可能感兴趣的文章
RxJava如何结合观察者与链式处理
查看>>
iOS多线程之GCD
查看>>
新入手MacBook Pro环境搭建
查看>>
Flutter免费视频第二季-常用组件讲解
查看>>
两种单例的实现方式
查看>>
小码哥iOS学习笔记第二十四天: Tagged Pointer
查看>>
GUI设计和UI设计有什么区别?
查看>>
element-ui table表格组件实现手风琴效果
查看>>
Flutter开发之插件入门(免费课程)
查看>>
ueditor编辑html问题总结
查看>>
【本人秃顶程序员】分享一些数据结构与算法常用的算法技巧总结
查看>>
TCP/IP协议 UDP浅析
查看>>
java性能调优记录(限流)
查看>>
UOJ #22 缩进优化
查看>>
能管中心系统建设重点能耗管理系统搭建
查看>>
promise实现过程
查看>>
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
查看>>
用户评测 | Docker管理面板系列——云帮(RainBond/CloudHelp 出色的k8s管理面板)
查看>>
一线实践 | 借助混沌工程工具 ChaosBlade 构建高可用的分布式系统
查看>>
并发 1
查看>>