这是我学习go语言的第二天,我试图弄清楚如何发出非阻塞的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()
}
有没有简单的方法可以发出非阻塞请求?或在这种情况下最好的方法是什么?
答案 0 :(得分:1)
正如已经回答的那样,每个HTTP请求都是在自己的go例程中处理的。 HTTP非常适合请求/响应模式。如果确实需要通过HTTP进行异步通信,则可以使用回调函数。但是我建议使用基于事件的消息传递。
答案 1 :(得分:0)
无法运行,如所注释的,http协议是同步的。
在操作码中,响应由底层框架在并行makeRequest
函数调用完成其工作之前发送和写入。
如果曾经将响应写入客户端,则客户端必须主动拒绝它,因为这不是该协议的正常行为。
不幸的是,OP代码中的gin
包如果尝试在封闭的响应上进行写操作,则不会触发错误。