2 回答

TA贡献1790条经验 获得超9个赞
检查他们的文档:
func Background() ContextBackground 返回一个非零的空上下文。它永远不会被取消,没有价值,也没有截止日期。它通常由 main 函数、初始化和测试使用,并作为传入请求的顶级上下文。
func TODO() ContextTODO 返回一个非零的空上下文。当不清楚要使用哪个 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()也(可能)返回错误。

TA贡献1789条经验 获得超8个赞
当不清楚要使用哪个 Context 或它尚不可用时(因为尚未扩展周围函数以接受 Context 参数),代码应使用 context.TODO。
Background 返回一个非零的空上下文。它永远不会被取消,没有价值,也没有截止日期。它通常由 main 函数、初始化和测试使用,并作为传入请求的顶级上下文。
TODO
是一个占位符,用于明确表示将来应使用更合适的上下文更新代码,但目前还没有。Background
当不需要这样的指示并且您只需要一个没有值或取消的空根上下文时使用。它们返回的值是相同的;唯一的区别是语义,因为人们可能会扫描代码以TODO
查找上下文(或使用 linter 来这样做)作为需要更新/寻址的地方。
- 2 回答
- 0 关注
- 375 浏览
添加回答
举报