ZhangZhihui's Blog  

 

复制代码
func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 5 * time.Second)
    defer cancel()

    go f1(ctx)

    for i := 0; i < 10; i++ {
        select {
        case <-ctx.Done():
            fmt.Println("timed out")
        default:
            fmt.Println("main sleep for 1 second")
            time.Sleep(time.Second)
        }
    }

    time.Sleep(30 * time.Second)
    fmt.Println("main slept for 30 seconds")
}

func f1(ctx context.Context) {
    go f2()

    time.Sleep(10 * time.Second)
    fmt.Println("f1 slept for 10 seconds")
}

func f2() {
    time.Sleep(20 * time.Second)
    fmt.Println("f2 slept for 20 seconds")
}
复制代码

 

复制代码
zzh@ZZHPC:/zdata/Github/ztest$ go run main.go
main sleep for 1 second
main sleep for 1 second
main sleep for 1 second
main sleep for 1 second
main sleep for 1 second
main sleep for 1 second
timed out
timed out
timed out
timed out
f1 slept for 10 seconds
f2 slept for 20 seconds
main slept for 30 seconds
复制代码

From the output, we can see that context timing out cannot stop goroutines from executing.

 

context.Context can only relay the message that timeout or cancellation happened. It does not have the power to actually stop any goroutines (for details, see cancel a blocking operation in Go). The goroutine itself is responsible for checking the timeout and cancellation, and abort early.

 

复制代码
func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 5 * time.Second)
    defer cancel()

    go f1(ctx)

    for i := 0; i < 10; i++ {
        select {
        case <-ctx.Done():
            fmt.Println("timed out")
        default:
            fmt.Println("main sleep for 1 second")
            time.Sleep(time.Second)
        }
    }

    time.Sleep(30 * time.Second)
    fmt.Println("main slept for 30 seconds")
}

func f1(ctx context.Context) {
    go f2()

    select {
    case <-ctx.Done():
        fmt.Println(ctx.Err())
    case <-time.After(10 * time.Second):
        fmt.Println("f1 slept for 10 seconds")
    }
}

func f2() {
    time.Sleep(20 * time.Second)
    fmt.Println("f2 slept for 20 seconds")
}
复制代码

 

复制代码
zzh@ZZHPC:/zdata/Github/ztest$ go run main.go
main sleep for 1 second
main sleep for 1 second
main sleep for 1 second
main sleep for 1 second
main sleep for 1 second
context deadline exceeded
timed out
timed out
timed out
timed out
timed out
f2 slept for 20 seconds
main slept for 30 seconds
复制代码

 

posted on   ZhangZhihuiAAA  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
 
点击右上角即可分享
微信分享提示