在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(即写入磁盘),那么这是另一回事。