go - 在 Golang 中异步完成 http.Request

标签 go

我想将所有到达的 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/

相关文章:

json - 根据 key 解码 JSON

go - Bcrypt hashedSecret 太短,不能成为 bcrypted 密码

go - Go-Stomp读取超时如何解决

sockets - 使用 Go 语言发送带有以太网 header 的原始数据包

go - 未定义的全局变量

variables - := 左侧没有新变量

go - 解码在根级别没有键的元组

go - 意外类型 : . .. 在 Go 中使用 cgo

go - 如何在带有身份验证 header 的浏览器中打开 URL?

go - golang 可以在 C++ 中做类似#define 的事情吗?