在Golang中异步完成http.Request

在Golang中异步完成http.Request,go,Go,我想将所有到达的http.Requests放入一个队列,并让一个单独的线程(goroutine?)处理这些请求并返回相应的状态 但是,主http请求处理程序直接完成请求,即使http.request对象异步发送到goroutine 有没有一种方法可以控制http.Request何时完成,从而异步处理它 [更新] 我想实现生产者-消费者模型。主请求处理程序生成请求并将它们放入队列。使用者线程(或多个线程)将读取这些请求,使用请求体并返回它们。http处理程序在每个请求的不同goroutine中执行

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

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

有没有一种方法可以控制http.Request何时完成,从而异步处理它

[更新]


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

http处理程序在每个请求的不同goroutine中执行,因此,如果您只是尝试释放主服务循环,则不必这样做

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

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

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

正如Jorge Marey所提到的,频道也可以工作

尽管如此,我还是建议您考虑一下,因为它是一个专门为带超时的多阶段处理而设计的包

我猜最终会有一个通道通过如下结构:

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

我得承认我不明白你的问题是什么?包net/http已异步处理请求。当然,如果处理程序完成了,请求就完成了。如果您不想这样做,您的处理程序不应该终止,而应该异步执行您打算执行的其他工作。很高兴知道net/http包异步处理http请求。但我想将所有http请求从处理程序(生产者)推送到队列中,让另一个线程(消费者)读取这些请求及其数据并返回它们(我将用其中一些更新主要问题以提高可见性)。好吧,我认为这是荒谬的,因为这使请求处理成为一个同步过程,但这是可以做到的:请求处理程序将请求推送到通道1并等待(!!),直到消费者通过等待通道2上的结果来处理请求。消费者监听通道1,获取请求,处理它们并通过通道2返回给生产者。完成串行处理。别那样做,那是胡说八道。Go http服务器已经是生产者,而您的处理程序是消费者,无需重复此工作。通过http请求发送的数据需要写入磁盘。显然,我会对此进行基准测试,但一般来说,让多个线程写入单个旋转磁盘不是一个好主意,因为这会增加查找的次数。这里听起来有些混乱:您是指
http.Request
(在服务器中)还是
http.Response
(即,您的应用程序是http客户端)。如果您想编写一个可以并发发出(例如)50多个请求的客户端,然后将
http.Response
推送到一个通道中,这样您就可以逐个消化
http.Response.Body
s(即写入磁盘),那么这是另一回事。