请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于select的问题

如果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 08:27:27

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 smilerr #1
    第一个问题我还是有困惑,如果它们三个同时到达!我们的预期是选择超时case让它退出,结果select 恰好没随机到超时这个case!
    回复 有任何疑惑可以回复我~ 2018-02-07 09:49:40
  • ccmouse 回复 提问者 smilerr #2
    这个的确有可能,本来即使是sleep也都不是准的。它保证的是如果c1,c2一直有数据来,他们不会一直被选中,time会有被选中的机会
    回复 有任何疑惑可以回复我~ 2018-02-07 11:06:02
  • 提问者 smilerr 回复 ccmouse #3
    我明白了,我之前理解的随机是随机其中一个case,其他的case会被丢掉!忘了外面的for循环了!非常感谢ccmouse老师!
    回复 有任何疑惑可以回复我~ 2018-02-07 11:55:46
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信