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

smilerr
2018-02-06
如果select中有多个case,包括超时机制,例如
select{
case n=<-c1:
case n=<-c2:
case <-time.After:
}当c1,c2和超时同时到达怎么办,如果没有随机到超时,会不会永远就退不出去了?还有一个问题是您讲的例子中为什么不直接这么写
select{
case n=<-c1:
worker<-n
case n=<-c2:
worker<-n
}
而要中间加一个activeWorker呢?
写回答
1回答
-
第一个问题,应该是假设c1,c2流量很大的情况,但不会没法随机到那个time.After。select里面自带调度,在随机的同时会兼顾公平性。
第二个问题,用了select,那么尽量所有会阻塞的操作都放在case里(或者开goroutine)。不然比如您的例子里面worker收的很慢,在worker<-n这行阻塞,但是c1,c2有了数据。这种情况我们就收不了c1,c2的数据,进而阻塞c1,c2的发送方。
032018-02-07
相似问题