程序开发 · 2025年5月7日

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

你在学习
GOLANG相关的知识吗?本文
《Go 中使用 context 包时,执行 Cancel 后》,主要介绍的内容就涉及到
,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!,
,
context 执行 cancel,但 <- ctx.done() 没执行?,在 go 中使用 context 包时,遇到一个问题:执行了 ctx.done() 取消了 context,但 goroutine 中的 <- ctx.done() 却没有执行,这导致程序无法正常退出。,这个问题的本质是阻塞在 channel 写入操作上。在给出的代码示例中,goroutine 的 select 语句阻塞在 ch <- n 中:,当执行 cancel() 取消 context 时,虽然 ctx.done() 返回了,但此时 goroutine 仍然阻塞在 ch <- n 中,因此不会执行 <- ctx.done()。,要解决这个问题,一种方法是关闭 channel,以指示 goroutine 终止:,关闭 channel 后,range 遍历会结束,goroutine 也能正常退出。,以上就是《Go 中使用 context 包时,执行 Cancel 后》的详细内容,更多关于的资料请关注GOLANG公众号!,context 执行 cancel,但 <- ctx.done() 没执行?,你在学习
GOLANG相关的知识吗?本文
《Go 中使用 context 包时,执行 Cancel 后》,主要介绍的内容就涉及到
,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!,

当前位置: > > > > Go 中使用 context 包时,执行 Cancel 后

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

2024-11-18 14:34:05
0浏览
收藏

你在学习GOLANG相关的知识吗?本文《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公众号!

Win11程序兼容性助手怎么关闭 Win11程序兼容性助手关闭方法
索尼相机cmos型号