社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
How to correctly use package context
by Jack Lindamood
at Golang UK Conf. 2017
视频:https://www.youtube.com/watch?v=-_B5uQ4UGi0
博文:https://medium.com/@cep21/how-to-correctly-use-context-context-in-go-1-7-8f2c0fafdf39
如果进一步考虑。
如上图这样的 RPC 调用,开始调用 RPC 1 后,里面分别调用了 RPC 2, RPC 3, RPC 4,等所有 RPC 用成功后,返回结果。
这是正常的方式,但是如果 RPC 2 调用失败了会发生什么?
RPC 2 失败后,如果没有 Context 的存在,那么我们可能依旧会等所有的 RPC 执行完毕,但是由于 RPC 2 败了,所以其实其它的 RPC 结果意义不大了,我们依旧需要给用户返回错误。因此我们白白的浪费了 10ms,完全没必要去等待其它 RPC 执行完毕。
那如果我们在 RPC 2 失败后,就直接给用户返回失败呢?
用户是在 30ms 的位置收到了错误消息,可是 RPC 3 和 RPC 4 依然在没意义的运行,还在浪费计算和IO资源。
所以理想状态应该是如上图,当 RPC 2 出错后,除了返回用户错误信息外,我们也应该有某种方式可以通知 RPC 3 和 RPC 4,让他们也停止运行,不再浪费资源。
所以解决方案就是:
那干脆让我们把变量也扔那吧。
context.Context:
示例 Context 链
完整代码:https://play.golang.org/p/ddpofBV1QS
package mainfunc tree() { ctx1 := context.Background() ctx2, _ := context.WithCancel(ctx1) ctx3, _ := context.WithTimeout(ctx2, time.Second * 5) ctx4, _ := context.WithTimeout(ctx3, time.Second * 3) ctx5, _ := context.WithTimeout(ctx3, time.Second * 6) ctx6 := context.WithValue(ctx5, "userID
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!