为了账号安全,请及时绑定邮箱和手机立即绑定

context.TODO() 或 context.Background(),我更喜欢哪一个?

context.TODO() 或 context.Background(),我更喜欢哪一个?

Go
HUX布斯 2023-03-07 14:43:16
我目前正在将我们的代码从全局标志包迁移到 mongo-driver,不知道我应该在哪里使用context.TODO(),context.Background()这真的很混乱,我知道它返回非零空,所以我应该context.Background()在主函数中使用 &init()功能?context.TODO()并在其他地方使用?有人能帮忙吗?试图检查我应该使用哪个参数context.TODO()或context.Background().
查看完整描述

2 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

检查他们的文档:

context.Background():

func Background() Context

Background 返回一个非零的空上下文。它永远不会被取消,没有价值,也没有截止日期。它通常由 main 函数、初始化和测试使用,并作为传入请求的顶级上下文。

context.TODO():

func TODO() Context

TODO 返回一个非零的空上下文。当不清楚要使用哪个 Context 或它尚不可用时(因为尚未扩展周围函数以接受 Context 参数),代码应使用 context.TODO。

根据文档,当您需要一个上下文但您(还)没有并且不知道该使用什么时,请使用context.TODO(). 这正是你的情况,使用context.TODO()正确的文件记录。此外,静态分析工具和 IDE 可能会支持发现这些上下文,并在稍后向您发出警告以解决该问题。

另请注意,如果在必须使用 mongo 驱动程序时确实有上下文,请考虑使用该上下文,或从中派生一个新上下文。

例如,如果您正在编写一个需要查询某些文档的 HTTP 处理程序,则 HTTP 请求http.Request已经有一个上下文,您可以使用Request.Context(). 当您调用需要上下文的其他 API 函数时,这是一个主要的候选对象。

为什么,你可能会问?因为当 HTTP 客户端放弃/中止请求时请求的上下文被取消,这意味着无论你做什么,客户端都不会收到它,所以例如如果 HTTP 处理程序只是提供信息,你也可以中止生成它,节省一些资源。因此,如果在您执行 MongoDB 查询时请求上下文被取消,您也可以取消查询,因为您无论如何都不需要(不会处理)结果。取消传递给查询执行的上下文(Collection.Find()例如)是告诉 MongoDB 服务器在可能的情况下取消查询的方法(因为您不需要结果)。

因此,在这种情况下使用请求上下文可以在 HTTP 服务器和 MongoDB 服务器上为您节省一些 CPU 时间和内存。

另一个例子:假设您必须在 10 秒内生成 HTTP 响应(可能是平台限制),在此期间您必须执行 MongoDB 操作,并且必须对结果进行后处理,这需要 4 秒。在这种情况下,如果 MongoDB 操作花费的时间超过 6 秒,您将无法完成后处理以适应 10 秒的限制。因此,如果 MongoDB 操作没有在 6 秒内完成,您还不如取消它。

解决这个问题的一个简单方法是派生一个超时为 6 秒的上下文:


如果查询在 30 秒内完成,一切都很好,您可以使用结果。如果不是,上下文将在 30 秒后被取消,因此c.Find()也(可能)返回错误。


查看完整回答
反对 回复 2023-03-07
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

context.TODO:

当不清楚要使用哪个 Context 或它尚不可用时(因为尚未扩展周围函数以接受 Context 参数),代码应使用 context.TODO。

context.Background:

Background 返回一个非零的空上下文。它永远不会被取消,没有价值,也没有截止日期。它通常由 main 函数、初始化和测试使用,并作为传入请求的顶级上下文。

TODO是一个占位符,用于明确表示将来应使用更合适的上下文更新代码,但目前还没有。Background当不需要这样的指示并且您只需要一个没有值或取消的空根上下文时使用。它们返回的值是相同的;唯一的区别是语义,因为人们可能会扫描代码以TODO查找上下文(或使用 linter 来这样做)作为需要更新/寻址的地方。


查看完整回答
反对 回复 2023-03-07
  • 2 回答
  • 0 关注
  • 375 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号