go - 如何导出入站请求结束后可以使用的上下文?

标签 go

来自 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?

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

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

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

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

  2. 您在问题中回避的可能是更安全、更简单的解决方案,即明确地将您仍然关心的任何值复制到使用 context.Background() 创建的新上下文.

关于go - 如何导出入站请求结束后可以使用的上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53286606/

相关文章:

go - 如何获取记录器的文件和函数名称

go - 缓慢的 json 编码和解码

Go Routines 有时有效,有时会出现关闭 channel 错误

Go的sync.Map加载结果无法添加

go - 在 Golang 中转换函数类型

unit-testing - 我可以期望(要求)go 测试失败吗?

optimization - 优化Go文件读取程序

go - 使用反射识别非内置类型

go - 如何在没有所有这些级联错误圣诞树的情况下编写干净的代码?

docker - 无法安装 golint 包 : wrong import path