我想将所有到达的 http.Request
放入一个队列中,并让一个单独的线程(goroutine
?)处理这些请求并返回适当的状态。
但是,即使 http.Request
对象异步发送到 goroutine
,主要的 http 请求
处理程序也会直接完成请求。
有没有办法控制 http.Request
何时完成,从而异步处理它?</p>
[更新]
我想实现生产者-消费者模型。主请求处理程序生成请求并将它们放入队列中。一个(或多个)消费者线程将读取这些请求,使用请求的主体并将它们返回。
最佳答案
http 处理程序在每个请求的不同 goroutine 中执行,因此如果您只是想释放主服务循环,则没有必要。
如果您希望对请求进行序列化处理,您可以使用 sync.Mutex
并让您的处理程序对其进行锁定。这会产生类似的效果,即一次处理一个请求。
我认为 sync.Mutex
不公平,所以它可能无法满足您的需求。
此外,如果您想在请求之间保持状态,那么这可能不是正确的解决方案。
正如 Jorge Marey 所提到的, channel 也可以发挥作用。
不过,我建议您看看 golang.org/x/net/context因为它是专门为带有超时和诸如此类的多阶段处理而设计的包。
我猜你最终会得到一个传递结构的 channel ,如下所示:
type Req struct{
ctx context.Context
w http.ResponseWriter
r *http.Request
}
关于go - 在 Golang 中异步完成 http.Request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33096365/