2 回答
TA贡献1775条经验 获得超8个赞
根据我的经验,Context
有两个主要用例:
传递信息。对于您的问题,您可能希望
request_id
为每个请求生成一个并将其传递到代码的最低部分,并记录它request_id
以在整个代码库中进行错误跟踪。此功能并不总是有用,例如您想要初始化 MongoDB 连接,但它是在服务启动期间完成的。此时没有有意义的上下文,
context.Background
超时应该足够了。对从 中检索到的变异值要小心,
Context
如果您要传递Context
所有内容,这可能会导致并发访问。自动取消和超时。这两个功能并非无中生有,您需要调整代码以处理来自
Context
. 但是大多数带有参数的第三方库和标准库Context
都可以很好地处理这两个特性(例如数据库库、HTTP 调用库)。Context
使用此功能,您可以在失效 后自动回收资源。有时您会想要停止这种级联行为,例如在后台 goroutine 中写入日志,那么您需要创建一个新的 goroutine
context.Background()
以避免这些写入在上游上下文被取消后被取消。context.Background()
还会清除信息上下文,因此有时您需要从上游上下文中提取上下文信息,并手动将它们附加到这个新上下文中。
Context
将参数强制用于所有函数有点矫枉过正,(添加Context
到简单greatestCommonDivisor
函数没有意义)但是将Context
参数添加到您需要的任何地方永远不会造成伤害。Context
具有足够好的性能,对于您的用例(HTTP 服务器和数据库编写),它不应该对您的服务造成可见的开销。
TA贡献1839条经验 获得超15个赞
我对自己的问题找到了一个有趣的答案,所以如果有同样的问题,我更愿意把它放在这里供未来的用户使用。
如果我将连接到 Mongo 的 SAME 上下文传递给 touserController
并将其进一步向下传递以CreateUser
运行:
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
注意:不是在函数中取消上下文,而是在NewMongoStore
函数defer cancel()
中取消上下文main
。
10 秒后,如果你打电话POST /users
,你会得到context deadline exceeded
,所以基本上你不能使用这个上下文来做其他事情,你必须在每次CreateUser
调用时创建新的上下文。
所以我写的很好。在我的示例中,我等待 10 秒连接到mongo
,插入操作上下文等待 1 秒。
- 2 回答
- 0 关注
- 90 浏览
添加回答
举报