Golang select的使用
今天在使用select中发现进程会堵塞,查阅资料,总结一下。
channel的功能点:
- 队列
- 阻塞
- 当一端阻塞,可以被另一个端唤醒
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)
附参考链接: