来自 net/http
包中的 func (r *Request) Context() context.Context
的文档:
For incoming server requests, the context is canceled when the client's connection closes, the request is canceled (with HTTP/2), or when the ServeHTTP method returns.
如果我想在 ServeHTTP
方法返回后完成与请求相关的工作,例如发出通知,正确的做法是什么?我想根据值保留上下文链,但仅将上述方法最初返回的上下文传递给消息队列提交 API 不起作用,因为上下文可能在完成之前被取消。
有没有一种简单的方法可以在没有截止日期或取消的情况下仅导出上下文链中的值?我可以手动复制我有键的值,但依赖上下文连续性的其他内容(如跟踪)将不存在。
提前感谢您的回答。
最佳答案
Is there an easy way to derive just the values?
开箱即用,没有。我可以想象有两种可能性:
您可以创建一个自定义上下文,它会吞没/忽略取消。这种类型需要
Done()
和Err()
的自定义实现,它们检测到超时/取消并忽略它。这种方法有一个可能的缺点,即您可能会引用预期在请求结束时超出范围的值。这可能会导致竞争条件或其他数据完整性问题。
我建议不要使用这种方法,尽管它可能最接近您的要求。上下文应该主要用于取消,因此在上下文中大量使用值是一种反模式。
您在问题中回避的可能是更安全、更简单的解决方案,即明确地将您仍然关心的任何值复制到使用
context.Background()
创建的新上下文.
关于go - 如何导出入站请求结束后可以使用的上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53286606/