登录
首页 >  Golang >  Go问答

一个与select语句运行机制相关的疑问

来源:stackoverflow

时间:2024-02-20 23:09:24 158浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《一个与select语句运行机制相关的疑问》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

当我阅读 select 部分的文档时,有些事情我真的无法理解。根据文档(以及 stackoverflow 上的答案), select 将选择一种可以运行(或不会阻塞)的情况。如果有多种情况,go 会随机选择其中一种。

因此,根据我的理解,以下情况应该随机运行:

for {
        select {
        case <-time.After(time.Millisecond * 101):
            fmt.Println("time out1")
        case <-time.After(time.Millisecond * 100):
            fmt.Println("time out2")
        }
        time.Sleep(time.Millisecond * 50)
    }

但实际上,它总是打印 timed out2

为什么只打印timed out2,我想第一种情况也没有阻塞程序,如果golang可以知道第二种情况需要多少时间,那么将这种情况替换为程序可以执行的操作如何不知道要花多少时间,比如db操作,http请求...

所以我认为,select总是返回最快的返回?


解决方案


time.After() 返回一个通道,超时到期时将在该通道上发送值。

因此,您有一个 select 和 2 个 case,其中两个来自通道的接收都被阻塞。因此 select 会阻塞,等待其中一个可以继续。

您的 2 个超时值不同,因此较小的超时值将更快准备好接收,因此一旦超时到期,可以立即选择该情况。

循环体结束,下一次迭代开始。您创建新的超时通道,因此重复相同的事情。

好了,本文到此结束,带大家了解了《一个与select语句运行机制相关的疑问》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>