登录
首页 >  Golang >  Go问答

我怎样才能在响应式上下文取消的情况下睡觉?

来源:stackoverflow

时间:2024-04-13 18:27:32 297浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《我怎样才能在响应式上下文取消的情况下睡觉?》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

在 Go 中,我想要 time.Sleep 一段时间(例如,在重试之间等待),但希望在上下文被取消时快速返回(不仅仅是从截止日期开始,还可以手动取消)。

正确或最好的方法是什么?谢谢!


解决方案


您可以使用 select 来实现此目的:

package main

import (
    "fmt"
    "time"
    "context"
)

func main() {
    fmt.println("hello, playground")
    ctx, cancel := context.withcancel(context.background())
    defer cancel()
    go func(){
        t := time.now()
        select{
        case <-ctx.done(): //context cancelled
        case <-time.after(2 * time.second): //timeout
        }
        fmt.printf("here after: %v\n", time.since(t))
    }()

    cancel() //cancel manually, comment out to see timeout kick in
    time.sleep(3 * time.second)
    fmt.println("done")

}

这是 Go-playground link

您可以像其他人提到的那样使用 select ;但是,其他答案有一个错误,因为 timer.after() 如果不清理的话会泄漏内存。

func SleepWithContext(ctx context.Context, d time.Duration) {
    timer := time.NewTimer(d)
    select {
    case <-ctx.Done():
        if !timer.Stop() {
            <-timer.C
        }
    case <-timer.C:
    }
}

终于介绍完啦!小伙伴们,这篇关于《我怎样才能在响应式上下文取消的情况下睡觉?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

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