我想将所有到达的http.Request
放入一个队列,并有一个单独的线程(goroutine
?)来处理这些请求并返回相应的状态。
但是,即使http request
对象异步发送到http.Request
,主goroutine
处理程序也会直接完成请求。
有没有办法控制http.Request
何时完成,从而异步处理它?</ p>
[更新]
我想实现一个生产者 - 消费者模型。主请求处理程序生成请求并将它们放入队列中。消费者线程(或多个线程)将读取这些请求,使用请求的主体并返回它们。
答案 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
}