当前位置: 首页 > 面试题库 >

使用goroutine时HTTP GET请求的时间响应

邵捷
2023-03-14
问题内容

我有一个简单的代码,可为文本文件(url_list.txt)中列出的每个URL打印GET响应时间。

当顺序触发请求时,返回的时间对应于各个URL的预期响应时间。

但是,当同时执行相同的代码时,返回的响应时间通常比预期的要高。

看来我在http.Get(url)调用之前捕获的 time_start
并不是实际发送请求的时间。我猜http.Get(url)的执行排队了一段时间。

使用goroutine时,是否有更好的方法来捕获URL响应时间?

这是我的代码:

顺序请求:

package main

import ("fmt"
        "net/http"
        "io/ioutil"
        "time"
        "strings"
)

func get_resp_time(url string) {
        time_start := time.Now()
        resp, err := http.Get(url)
        if err != nil {
            panic(err)
        }
        defer resp.Body.Close()
        fmt.Println(time.Since(time_start), url)
}

func main() {
    content, _ := ioutil.ReadFile("url_list.txt")
    urls := strings.Split(string(content), "\n")

    for _, url := range urls {
        get_resp_time(url)
        //go get_resp_time(url)
    }

    //time.Sleep(20 * time.Second)
}

并发请求:

package main

import ("fmt"
        "net/http"
        "io/ioutil"
        "time"
        "strings"
)

func get_resp_time(url string) {
        time_start := time.Now()
        resp, err := http.Get(url)
        if err != nil {
            panic(err)
        }
        defer resp.Body.Close()
        fmt.Println(time.Since(time_start), url)
}

func main() {
    content, _ := ioutil.ReadFile("url_list.txt")
    urls := strings.Split(string(content), "\n")

    for _, url := range urls {
        //get_resp_time(url)
        go get_resp_time(url)
    }

    time.Sleep(20 * time.Second)
}

问题答案:

您正在一次启动所有请求。如果文件中有1000个url,则您一次要启动1000个go例程。这可能有效,但可能会给您有关套接字或文件句柄不足的错误。我建议一次启动一定数量的抓取操作,例如下面的代码。

这也将有助于时间安排。

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "strings"
    "sync"
    "time"
)

func get_resp_time(url string) {
    time_start := time.Now()
    resp, err := http.Get(url)
    if err != nil {
        log.Printf("Error fetching: %v", err)
    }
    defer resp.Body.Close()
    fmt.Println(time.Since(time_start), url)
}

func main() {
    content, _ := ioutil.ReadFile("url_list.txt")
    urls := strings.Split(string(content), "\n")

    const workers = 25

    wg := new(sync.WaitGroup)
    in := make(chan string, 2*workers)

    for i := 0; i < workers; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for url := range in {
                get_resp_time(url)
            }
        }()
    }

    for _, url := range urls {
        if url != "" {
            in <- url
        }
    }
    close(in)
    wg.Wait()
}


 类似资料:
  • 向传递的 URL 发出一个 GET 请求。 使用 XMLHttpRequest web API 向给定的 url 发出 get 请求。 通过调用给定的 callback 和 responseText 来处理 onload 事件。 通过运行提供的 err 函数,处理onerror事件。 省略第四个参数 err ,默认将错误记录到控制台的 error 流。 const httpGet = (url,

  • 我有一个web服务,它接收JSON格式的数据,处理数据,然后将结果返回给请求者。 我想使用度量请求、响应和总时间。 我的示例请求如下所示: 目前我在Linux中使用命令来度量这个值: 但是time命令只测量总时间--这不是我想要的。 是否有任何方法可以使用来度量请求和响应时间?

  • 前言 Networkclient的poll函数: 其实是不断去查询请求是否超时 对 因为长期没有收到请求,设置状态为disconnect,然后希望重新建立连接

  • 本文向大家介绍使用Curl命令查看请求响应时间方法,包括了使用Curl命令查看请求响应时间方法的使用技巧和注意事项,需要的朋友参考一下 curl命令查看请求响应时间 -o:把curl 返回的html、js 写到垃圾回收站[ /dev/null] -s:去掉所有状态 -w:按照后面的格式写出rt time_namelookup:DNS 解析域名www.36nu.com的时间 time_commect

  • 我有一个spring-boot应用程序,它有一个后endpoint,接收请求并将其发送到另一个服务,然后获取响应并将其保存到mongo数据库,然后将响应返回给用户。该应用程序部署在spring boot的嵌入式tomcat上。我使用jmeter查看最大响应时间、吞吐量等。 当我用500个线程从jeter运行测试10分钟时,我的最大时间约为3500毫秒。当我从jeter重复测试时,最大时间会减少到9

  • 我在一个小型LINUX项目中工作,计算CURL和远程网站的请求延迟。 所以我做了一个外壳脚本来自动向远程Apache Webserver发送GET请求。在访问Apache的access.log时,我只找到来自CURL的请求仅由apache接收的时间。 是否也可以将CURL请求的日期发送到apache服务器?(时间戳) 谢谢