登录
首页 >  Golang >  Go问答

更正上下文取消错误

来源:stackoverflow

时间:2024-02-23 14:03:27 331浏览 收藏

今天golang学习网给大家带来了《更正上下文取消错误》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

我是 Go 的新手,并且每天仍在学习。我在我们的项目中看到很多 context cancelled 错误,这让我很恼火。所以我想更深入地了解一下到底发生了什么。

如果我没记错的话,用“简单”的术语来说,上下文取消意味着给定的请求(通过 grpc 使用 gokit)已经超时。正确的?如果是这样,解决这个问题的最佳方法应该是什么?

  1. 我是否应该调查为什么这些请求超时(可能底层数据库查询花费很长时间或其他原因)并修复这些问题?

  2. Go 内部是否有可能暗示与 Go 相关的内容?

  3. 开始处理此错误的最佳方法是什么?现在,我只看到“上下文已取消”,但不知道为什么会这样。


解决方案


上下文定义了上下文类型,它携带跨 api 边界和进程之间的截止日期、取消信号和其他请求范围的值。

对服务器的传入请求应创建一个上下文,对服务器的传出调用应接受一个上下文。

上下文取消错误并不一定意味着超时错误。

场景 1:

如果您正在使用 go 例程,如果父 go 例程完成但子例程仍在后台运行,并且子 go 例程具有与父 go 例程共用的上下文,这可能会导致上下文被取消,如果父 go 例程在退出之前关闭上下文。

因此,如果子例程不依赖于父例程上下文,那么为后台 go 例程创建新上下文始终是一个好习惯。可以使用 context.background() 创建新上下文

场景 2:

如果您的应用程序是基于微服务的(或者有多个使用上下文相互调用的组件),如果微服务 1 调用微服务 2,并且微服务 2 显式关闭或取消上下文,即使在这种情况下,您也可能会收到此错误。 p>

可以通过调用 cancel() 函数来关闭上下文,如下所示:

ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()

取消此上下文会释放与其关联的资源。因此,如果被调用者已显式关闭上下文(如上所示),则可能会导致调用者出现上下文取消错误。

这些上下文取消错误可以通过检查 grpc.dial() 调用中的 context.canceled 错误来处理(如果您使用 grpc)

终于介绍完啦!小伙伴们,这篇关于《更正上下文取消错误》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>