select timeout的问题
来源:11-4 用select进行调度

bbmouse
2019-07-07
select {
case n = <-c1:
values = append(values, n)
case n = <-c2:
values = append(values, n)
case activeWorker <-activeValue:
values = values[1:]
case <-time.After(800 * time.Millisecond):
fmt.Println("timeout")
case <-tick:
fmt.Println("queue len=", len(values))
case <-tm:
fmt.Println("bye")
return
}
<-time.After(800 * time.Millisecond) 这个case是怎么判断的啊?第一个好理解,就是收数据,收到就匹配到,但是这个800ms是怎么个匹配法?它是什么时候开始计时的?还是说第一次匹配到开始计时,?这里有点懵,老师帮忙解答下,
还有就是加了case <-tick:这个之后就打不出timeout了,这是为什么呢?我把800ms改成和tick一样都是1s 也不行,按理,这两个都是1秒的话,任何一个应该都可能被执行到吧?,
1回答
-
jierong
2019-07-10
1.
time.After(d Duration) 返回值是一个chan Time, case <-time.After(800 * time.Millisecond) 如果没有接收到数据就是nil,就不会执行,如果接收到数据就执行。
func generator() <-chan int {
out := make(chan int)
go func() {
i := 0
for {
time.Sleep(time.Duration(rand.Intn(1500)) * time.Millisecond)
out <- i
i++
}
}()
return out
}上面代码使用的是time.Duration(rand.Intn(1500)) * time.Millisecond如果时间低于800ms,case <-time.After(800 * time.Millisecond)将不会被执行,并且虽然goroutine是非抢占的,但是fmt.Println()是抢占式的,在10s内所有的fmt.Println()将抢占线程进行输出,fmt.Println("timeout")未必能够抢到线程。
2. case <-tick:这个之后就打不出timeout了,这个问题在第一个问题中已经说了,这个看fmt.Println()谁先抢到线程,抢到线程的就将打印。
022019-07-10
相似问题