Golang基于秒退出循环[关闭]

wlsrxk51  于 2023-03-27  发布在  Go
关注(0)|答案(2)|浏览(154)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

12小时前关门了。
Improve this question
我试图在一个循环中执行sql查询,循环需要退出5秒,如果迭代完成,也需要退出。

startTime := time.Now()
    for _, index := range indices {
        elapsedTime := time.Since(startTime)

        if elapsedTime.Seconds() >= 5 {
            break
        }
        // sql query execution
    }

有没有更好的办法呢?

pcww981p

pcww981p1#

暂时忽略这里明显的X-Y问题,在5秒后打破循环是微不足道的:
你可以只使用一个时间间隔和一个select来完成类似这样的操作:

timer := time.NewTimer(5 * time.Second)
defer timer.Stop() // always clean up
for _, i := range indeces {
    select {
    case <-timer.C():
        // timer has expired
        return // done
    default:
       // do whatever you want the loop to do
    }
}

简单。为了确保查询在5秒后不被执行,你也可以使用一个带有超时的上下文,并将该上下文传递给所有与SQL相关的调用:

ctx, cfunc := context.WithTimeout(context.Background(), 5 * time.Second)
defer cfunc() // again, always clean up after yourself

循环的其余部分看起来几乎相同:

for _, i := range indeces {
    select {
    case <-ctx.Done():
        return
    default:
       // do whatever
    }
}

X-Y问题

现在回到X-Y问题:我不确定实现一个硬时间限制是否是解决你的问题的方法。为什么你要迭代一个名为 “indeces” 的切片,这反过来又会导致在一段延长的时间内执行任意数量的查询,而且,正如你在评论中提到的,为什么所有这些查询一开始就不一样?这个循环应该做什么?你想实现什么?有一个接近100%的保证你所遇到的问题不应该被解决,而是可以很容易地避免的(因此,你问的是如何做Y,而真实的的问题是为什么你做了X,导致你现在寻找一种方法来做Y)

fnx2tebb

fnx2tebb2#

你是在问关于使用一个在5秒后超时的上下文的问题吗?根据你的实现,你可以把上下文传递给你的sql查询函数,或者在上下文超时时简单地从例程中返回。一个粗略的大纲可能看起来像这样。

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

_, err := db.ExecContext(ctx, "SELECT ...")

相关问题