问题:
并发编程的通信中,超时问题不可忽视,它指的是向channel写数据时发现channel已满,或者从channel尝试获取数据发现channel为空。如果不正确处理这些情况,很可能会导致整个goroutine锁死。
i := <-ch
不出问题一切进行,如果出现一个错误,比如永远没有人往ch写数据,那这个读取动作将永远拿不到数据,导致的结果就是整个goroutine永远阻塞并没有挽回的机会。
解决方案:
Go本身没有提供直接的超时处理机制,但可以利用select机制。虽然select机制不是专为超时设计的,却方便解决问题。select的特点是只要其中一个case执行,程序就会继续往下执行,而不会考虑其它case情况。
为channel实现超时机制,如:
timeout := make(chan bool,1)
go func(){
time.Sleep(1e9) //等待一秒
timeout <- true
}()
//把timeout这个channel利用起来
select{
case <- ch:
//从ch中读取到数据
case <- timeout:
//一直没有从ch读到数据,但从timeout拿到了数据
}