go select 用法

Golang select的使用

今天在使用select中发现进程会堵塞,查阅资料,总结一下。

channel的功能点:

  1. 队列
  2. 阻塞
  3. 当一端阻塞,可以被另一个端唤醒

select是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。


select中的case语句必须是一个channel操作
select中的default子句总是可运行的,速度非常快。
如果有多个case都可以运行,select会随机公平地选出一个执行,其他不会执行。
如果没有可运行的case语句,且有default语句,那么就会执行default的动作。
如果没有可运行的case语句,且没有default语句,select将阻塞,直到某个case通信可以运行

1.程序无需退出,加default做操作。防止阻塞

2.如果需要等待,则加入超时case

case <-time.After(time.Second * 1):
   return errors.New(" timeout")
}

3.不想等待,且程序退出

var shouldQuit=make(chan struct{})
fun main(){
    {
        //loop
    }
    select {
        case <-c.shouldQuit:
            cleanUp()
            return
        default:
        }
}

//再另外一个协程中,如果运行遇到非法操作或不可处理的错误,就向shouldQuit发送数据通知程序停止运行
close(shouldQuit)
 

附参考链接:

https://blog.youkuaiyun.com/zhaominpro/article/details/77570290?utm_source=debugrun&utm_medium=referral


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值