gpt4 book ai didi

go - select语句的运行机制问题

转载 作者:行者123 更新时间:2023-12-01 22:45:23 24 4
gpt4 key购买 nike

当我阅读选择部分的文档时,有些东西我真的无法理解。使用文档(以及 StackOverflow 上的答案),select 将选择一个可以运行(或不会阻止)的案例。如果有多个 case,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() 返回超时到期时将在其上发送值的 channel 。
所以你有一个 select与 2 case s,其中两个来自 channel 的接收都是阻塞的。所以select block ,等到其中一个可以继续。
您的 2 个超时值是不同的,因此较小的一个将准备好更快地接收,因此一旦超时到期,就可以立即选择这种情况。
您的循环体结束,下一次迭代开始。你创建了新的超时 channel ,所以同样的事情会重复。

关于go - select语句的运行机制问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62654037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com