gpt4 book ai didi

for-loop - 在 n 秒后中断的循环

转载 作者:IT王子 更新时间:2023-10-29 00:48:29 26 4
gpt4 key购买 nike

如何让这个简单的 for 循环在执行后恰好经过一个 1 后中断?

var i int

for {
i++
}

最佳答案

通过检查自开始以来耗时:

var i int
for start := time.Now(); time.Since(start) < time.Second; {
i++
}

或者使用“超时” channel ,通过调用 time.After() 获取.使用 select 来检查时间是否已到,但您必须添加一个 default 分支,以便它成为非阻塞检查。如果时间到了,则退出循环。使用标签并从 for 循环中中断也很重要,否则 break 只会从 select 中中断,这将是一个无限循环.

loop:
for timeout := time.After(time.Second); ; {
select {
case <-timeout:
break loop
default:
}
i++
}

注意:如果循环体还执行通信操作(如发送或接收),使用超时 channel 可能是唯一可行的选择! (您可以在同一个 select 中列出超时检查和循环的通信操作。)

我们可能会重写超时 channel 解决方案以不使用标签:

for stay, timeout := true, time.After(time.Second); stay; {
i++
select {
case <-timeout:
stay = false
default:
}
}

优化

我知道你的循环只是一个例子,但如果循环只做一点点工作,就不值得在每次迭代中检查超时。我们可以重写第一个解决方案来检查超时,例如在这样的每 10 次迭代中:

var i int
for start := time.Now(); ; {
if i % 10 == 0 {
if time.Since(start) > time.Second {
break
}
}
i++
}

我们可以选择一个迭代次数,它是 2 的倍数,然后我们可以使用位掩码,它应该比余数检查更快:

var i int
for start := time.Now(); ; {
if i&0x0f == 0 { // Check in every 16th iteration
if time.Since(start) > time.Second {
break
}
}
i++
}

我们也可以计算一次结束时间(循环必须结束的时间),然后你只需要将当前时间与此进行比较:

var i int
for end := time.Now().Add(time.Second); ; {
if i&0x0f == 0 { // Check in every 16th iteration
if time.Now().After(end) {
break
}
}
i++
}

关于for-loop - 在 n 秒后中断的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41738680/

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