golang 走起(六) 逾時
代碼:
package main
import (
"log"
"time"
)
func main() {
ch := make(chan int,)
to := make(chan bool)
defer func() {
close(ch)
close(to)
log.Println("h")
}()
go func() {
time.Sleep(time.Second)
to <- true
}()
go func() {
m := <- ch
log.Println("recv ok, m:", m)
time.Sleep(time.Second *)
}()
for i :=; i <; i++ {
log.Println("send i:", i)
select {
case ch <- i:
log.Println("send ok i:", i)
case <- to:
log.Println("timeout, i:", i)
return
// default:
// log.Println("send failed i:", i)
}
}
}
結果:
2016/03/04 15:02:48 send i: 0
2016/03/04 15:02:48 send ok i: 0
2016/03/04 15:02:48 send i: 1
2016/03/04 15:02:48 send ok i: 1
2016/03/04 15:02:48 send i: 2
2016/03/04 15:02:48 recv ok, m: 0
2016/03/04 15:02:48 send ok i: 2
2016/03/04 15:02:48 send i: 3
2016/03/04 15:02:49 timeout, i: 3
2016/03/04 15:02:49 h
代碼中ch是2個int的chan,發送多個時如果不擷取的話就會卡主,直到擷取到為止,我們需要一個逾時的機制保證不會卡死。
除了逾時還有其他的辦法嗎?
有,就是default使用,但是它是有弊端的,這裡我們把default注釋打開
結果:
2016/03/04 15:08:14 send i: 0
2016/03/04 15:08:14 send ok i: 0
2016/03/04 15:08:14 send i: 1
2016/03/04 15:08:14 send ok i: 1
2016/03/04 15:08:14 send i: 2
2016/03/04 15:08:14 send failed i: 2
2016/03/04 15:08:14 send i: 3
2016/03/04 15:08:14 send failed i: 3
2016/03/04 15:08:14 send i: 4
2016/03/04 15:08:14 send failed i: 4
2016/03/04 15:08:14 send i: 5
2016/03/04 15:08:14 send failed i: 5
2016/03/04 15:08:14 send i: 6
2016/03/04 15:08:14 send failed i: 6
2016/03/04 15:08:14 send i: 7
2016/03/04 15:08:14 send failed i: 7
2016/03/04 15:08:14 send i: 8
2016/03/04 15:08:14 send failed i: 8
2016/03/04 15:08:14 send i: 9
2016/03/04 15:08:14 send failed i: 9
2016/03/04 15:08:14 h
可以看出從第三個開始就failed,也就是走default語句了,而不會出現卡死的情況,但是後邊沒有放進去的資料就會被丢棄了
是以如何去把控使用,需要自己斟酌