这是我学习go lang的第二天,我正在尝试弄清楚如何发出非阻塞的http请求。
我使用gin框架,代码非常简单,如下所示。
func main() {
r := gin.Default()
r.GET("test", func(c *gin.Context){
request := gorequest.New()
_, body, _ := request.Get("http://tmp.com").End()
c.JSON(200, body)
})
r.Run()
}
tmp.com是一个本地服务器,需要0.5秒才能响应(我创建它是为了测试)
当我用wrk -t2 -c50 http://127.0.0.1:8080/test
在go服务器上做一个简单的ab测试时,我得到了大约8个请求/秒。
看起来请求被阻塞了。
我尝试将请求分离到一个函数中,然后用"go“调用它来使用协程,但这只是简单地没有返回任何东西。
我修改后的代码是
func makeRequest(c *gin.Context) {
request := gorequest.New()
_, body, _ := request.Get("http://tmp.com").End()
c.JSON(200, body)
}
func main() {
r := gin.Default()
r.GET("test", func(c *gin.Context){
go makeRequest(c)
})
r.Run()
}
有没有简单的方法来做非阻塞请求?或者在这种情况下最好的方法是什么?
发布于 2018-09-04 10:24:02
如前所述,每个HTTP请求都是在它自己的go例程中处理的。HTTP非常适合请求/响应模式。如果您确实需要通过HTTP进行异步通信,则可以使用回调函数。然而,我建议使用基于事件的消息传递。
发布于 2018-09-02 16:09:54
这不能工作,正如评论所说,http协议是同步的。
在操作代码中,响应由底层框架在并行makeRequest
函数调用完成其工作之前发送和写入。
如果响应曾经写入客户端,客户端必须主动拒绝它,因为这不是此协议的正常行为。
操作码中的不幸之处在于,如果gin
包试图写入关闭的响应,它将不会触发错误。
https://stackoverflow.com/questions/52134606
复制相似问题