Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 如何在go lang中发出非阻塞http请求?_Asynchronous_Go_Request - Fatal编程技术网

Asynchronous 如何在go lang中发出非阻塞http请求?

Asynchronous 如何在go lang中发出非阻塞http请求?,asynchronous,go,request,Asynchronous,Go,Request,这是我学习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(2

这是我学习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在go服务器上进行简单的ab测试时http://127.0.0.1:8080/test
,我每秒收到大约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协议是同步的

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

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


OP代码中不幸的是,
gin
包如果试图在关闭的响应上写入,则不会触发错误。

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

每个传入的请求都已经在其自己的goroutine中处理。@zerkms感谢您提供的信息。我无法在金的文件上确认这一点。这是有道理的。我想我不必担心在这种情况下使单个http请求异步。它使用标准go的
http
来处理忽略错误处理的请求,最好的方法是在第一个代码段中。在本例中不需要非阻塞。如果要将来自tmp.com的响应返回给客户端,则无法实现非阻塞。HTTP是同步协议:客户端发出请求并等待响应。