在Golang中异步完成http.Request

时间:2015-10-13 07:14:44

标签: go

我想将所有到达的http.Request放入一个队列,并有一个单独的线程(goroutine?)来处理这些请求并返回相应的状态。

但是,即使http request对象异步发送到http.Request,主goroutine处理程序也会直接完成请求。

有没有办法控制http.Request何时完成,从而异步处理它?<​​/ p>

[更新]

我想实现一个生产者 - 消费者模型。主请求处理程序生成请求并将它们放入队列中。消费者线程(或多个线程)将读取这些请求,使用请求的主体并返回它们。

1 个答案:

答案 0 :(得分:1)

http处理程序在每个请求的不同goroutine中执行,所以如果你只是想释放主服务循环,那就不是必需的了。

如果您希望序列化请求的处理,可以使用sync.Mutex并让您的处理程序锁定。这会产生类似的效果,因为请求将一次处理一个。

我认为sync.Mutex不公平,因此可能无法满足您的需求。

另外,如果您希望在请求之间保持有状态,那么这可能不是正确的解决方案。

正如Jorge Marey所说,渠道也会奏效。

尽管如此,我建议您查看golang.org/x/net/context,因为它是专为多阶段处理而设计的包,具有超时等等。

我的猜测是你最终会得到一个传递结构的通道:

type Req struct{
   ctx context.Context
   w http.ResponseWriter
   r *http.Request
}