如何获得入站请求结束后可以使用的上下文?

时间:2018-11-13 17:34:04

标签: go

func (r *Request) Context() context.Context软件包中的net/http的文档开始:

  

对于传入的服务器请求,当客户端的连接关闭,请求被取消(使用HTTP / 2)或ServeHTTP方法返回时,上下文将被取消。

如果我想在返回ServeHTTP方法(例如发出通知)之后完成与请求相关的工作,该怎么办?我想按值保留上下文链,但是仅将最初由上述方法返回的上下文传递给消息队列提交API无效,因为上下文可能在完成之前被取消。

是否有一种简单的方法可以在没有期限或取消的情况下仅导出上下文链中的值?我可以手动复制具有键的值,但是不存在依赖上下文连续性的其他事情,例如跟踪。

在此先感谢您的回答。

1 个答案:

答案 0 :(得分:1)

  

是否有一种简单的方法来仅导出值?

开箱即用,否。我可以想象有两种可能性:

  1. 您可以创建一个自定义上下文,该上下文吞噬/忽略取消操作。这样的类型需要Done()Err()的自定义实现,它们检测到超时/取消并忽略了它。

    此方法可能有一个缺点,即您可能引用的是在请求结束时可能超出范围的值。这可能会导致竞争状况或其他数据完整性问题。

    我建议不要使用此方法,尽管它可能是最接近您要求的方法。上下文应主要用于取消操作,因此在上下文中大量使用值是一种反模式。

  2. 您可能会想避开的一个更安全,更轻松的解决方案是将您仍然关心的所有值明确复制到使用context.Background()创建的新上下文中。