登录
首页 >  Golang >  Go教程

Go 中使用 context 包时,执行 Cancel 后

时间:2024-11-18 14:34:05 277浏览 收藏

你在学习Golang相关的知识吗?本文《Go 中使用 context 包时,执行 Cancel 后》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

Go 中使用 context 包时,执行 Cancel 后

context 执行 cancel,但 <- ctx.done() 没执行?

在 go 中使用 context 包时,遇到一个问题:执行了 ctx.done() 取消了 context,但 goroutine 中的 <- ctx.done() 却没有执行,这导致程序无法正常退出。

这个问题的本质是阻塞在 channel 写入操作上。在给出的代码示例中,goroutine 的 select 语句阻塞在 ch <- n 中:

    for {
        select {
        case <-ctx.done():
            fmt.println("done")
        default:
            n += 1
            ch <- n
        }
    }

当执行 cancel() 取消 context 时,虽然 ctx.done() 返回了,但此时 goroutine 仍然阻塞在 ch <- n 中,因此不会执行 <- ctx.done()。

要解决这个问题,一种方法是关闭 channel,以指示 goroutine 终止:

    for {
        select {
        case <-ctx.Done():
            fmt.Println("done")
            close(ch) // 关闭 channel
            return
        default:
            n += 1
            ch <- n
        }
    }

关闭 channel 后,range 遍历会结束,goroutine 也能正常退出。

以上就是《Go 中使用 context 包时,执行 Cancel 后》的详细内容,更多关于的资料请关注golang学习网公众号!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>