您的位置 首页 知识分享

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

context 执行 cancel,但 在 go 中使用 context 包时,遇到一个问题:执行了 ctx.…

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

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中文网其它相关文章!

本文来自网络,不代表甲倪知识立场,转载请注明出处:http://www.spjiani.cn/wp/5023.html

作者: nijia

发表评论

您的电子邮箱地址不会被公开。

联系我们

联系我们

0898-88881688

在线咨询: QQ交谈

邮箱: email@wangzhan.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部