首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在go lang中进行非阻塞http请求?

如何在go lang中进行非阻塞http请求?
EN

Stack Overflow用户
提问于 2018-09-02 14:40:08
回答 2查看 9K关注 0票数 1

这是我学习go lang的第二天,我正在尝试弄清楚如何发出非阻塞的http请求。

我使用gin框架,代码非常简单,如下所示。

代码语言:javascript
运行
复制
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“调用它来使用协程,但这只是简单地没有返回任何东西。

我修改后的代码是

代码语言:javascript
运行
复制
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()
}

有没有简单的方法来做非阻塞请求?或者在这种情况下最好的方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2018-09-04 10:24:02

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

票数 1
EN

Stack Overflow用户

发布于 2018-09-02 16:09:54

这不能工作,正如评论所说,http协议是同步的。

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

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

操作码中的不幸之处在于,如果gin包试图写入关闭的响应,它将不会触发错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52134606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档