今天我给大家带来《如何在Go lang中发出非阻塞Http请求?》,这篇文章主要讲到等等知识,如果你对golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!
问题内容
这是我学习 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()
}
有没有一种简单的方法来发出非阻塞请求?或者在这种情况下最好的方法是什么?
解决方案
正如已经回答的,每个 HTTP 请求都在它自己的 go 例程中处理。 HTTP 非常适合请求/响应模式。如果您确实需要通过 HTTP 进行异步通信,您可以使用回调函数。不过,我建议使用基于事件的消息传递。