2015-10-13 50 views
0

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

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

有没有办法控制http.Request何时完成并由此异步处理?

[更新]

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

+4

我不得不承认,我不明白这是你的问题吗?打包net/http _does_进程请求已经异步。当然,如果处理程序完成请求,则完成。如果你不想要这个,你的处理程序不应该终止,而是做你打算异步执行的其他工作。 – Volker

+0

很高兴知道net/http包异步处理http请求。但是我想把所有的http请求从处理程序(生产者)推入队列,并让另一个线程(消费者)读取这些请求及其数据并返回它们(为了更好的可见性,我将用一些更新主要问题)。 –

+1

好吧,我认为这是无意义的,因为这使得请求处理**同步**过程,但它可以完成:请求处理程序将请求推入通道1和_waits_(!!),直到消费者处理完请求等待通道2的结果。消费者在通道1上侦听,获取请求,处理它们并通过通道2返回给制作人。完成串行处理。不要那样做,这是无稽之谈。 Go http服务器_is_已经是生产者和您的处理程序_are_消费者,因此不需要重做此项工作。 – Volker

回答

1

对于每个请求,http处理程序都在不同的goroutine中执行,所以如果您只是试图释放主要的服务循环,那么它不是必需的。

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

我不认为sync.Mutex是公平的,所以它可能无法满足您的需求。

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

正如豪尔赫马雷提到的,渠道也会起作用。

虽然,我建议你看看golang.org/x/net/context,因为它是一个专门为多阶段处理而设计的软件包,具有超时和什么。

我的猜测是,你最终会与通过结构看起来像一个通道:

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