php中文网

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

php中文网

context 执行 cancel,但

在 go 中使用 context 包时,遇到一个问题:执行了 ctx.done() 取消了 context,但 goroutine 中的

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

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

当执行 cancel() 取消 context 时,虽然 ctx.done() 返回了,但此时 goroutine 仍然阻塞在 ch

要解决这个问题,一种方法是关闭 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 后的详细内容,更多请关注php中文网其它相关文章!