如何在Go lang中进行非阻塞的HTTP请求?

时间:2018-09-02 06:40:08

标签: asynchronous go request

这是我学习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()
}

有没有简单的方法可以发出非阻塞请求?或在这种情况下最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

正如已经回答的那样,每个HTTP请求都是在自己的go例程中处理的。 HTTP非常适合请求/响应模式。如果确实需要通过HTTP进行异步通信,则可以使用回调函数。但是我建议使用基于事件的消息传递。

答案 1 :(得分:0)

无法运行,如所注释的,http协议是同步的。

在操作码中,响应由底层框架在并行makeRequest函数调用完成其工作之前发送和写入。

如果曾经将响应写入客户端,则客户端必须主动拒绝它,因为这不是该协议的正常行为。

不幸的是,OP代码中的gin包如果尝试在封闭的响应上进行写操作,则不会触发错误。