关于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回答

ccmouse

2018-02-07

第一个问题,应该是假设c1,c2流量很大的情况,但不会没法随机到那个time.After。select里面自带调度,在随机的同时会兼顾公平性。

第二个问题,用了select,那么尽量所有会阻塞的操作都放在case里(或者开goroutine)。不然比如您的例子里面worker收的很慢,在worker<-n这行阻塞,但是c1,c2有了数据。这种情况我们就收不了c1,c2的数据,进而阻塞c1,c2的发送方。

0
3
smilerr
回复
ccmouse
我明白了,我之前理解的随机是随机其中一个case,其他的case会被丢掉!忘了外面的for循环了!非常感谢ccmouse老师!
2018-02-07
共3条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程