
代码如下:
func check_url(url string) { client := &http.Client{ Timeout: time.Second * 5, } req, _ := http.NewRequest("GET", url, nil) req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36") resp, err := client.Do(req) if err == nil { defer resp.Body.Close() status := resp.Status if strings.Contains(status, "200") { fmt.Println(url,"===请求成功===") } } } 小弟刚学 go ,我需要同时并发几万个 url 请求,调用 check_url 函数,发现有时候明明可以访问的端口,却报 context deadline exceeded (Client.Timeout exceeded while awaiting headers) 错误,怎么优化这个 check_url 函数呢?
1 hxysnail 2022 年 9 月 22 日 你的 Client 设置了 5 秒钟超时,把时间调长一点呗 |
2 biuyixia OP 内网请求,大佬。不需要那么长的超时时间 |
3 biuyixia OP |
4 licoycn 2022 年 9 月 22 日 |
https://github.com/go-resty/resty 试试用这个 http 工具呢? |
7 Nazz 2022 年 9 月 22 日 需要限制并发协程数量 |
9 coderxy 2022 年 9 月 22 日 go 的 http client 默认有连接池限制的, 先把那个限制调大一点再试试 |
10 d29107d 2022 年 9 月 22 日 via Android 也有可能被请求端承受不了啊 |
11 biuyixia OP @Nazz 我是通过 Ants github.com/panjf2000/ants ,因为用的同一个函数,通过 NewPoolWithFunc 创建了一个 20000 的协程池。 |
12 seers 2022 年 9 月 22 日 via Android 系统的 open file 数没打开吧,连接满了后面的 tcp 连接没发出去所以超时了,ulimit 确认下 |
13 seers 2022 年 9 月 22 日 via Android 你最后 err 打印下看看错误是啥,不要是 nil 后就不管了 |
14 dcalsky 2022 年 9 月 22 日 optimize your http client transport, increase the number of idle connection for each host in the connection pool. |
15 runningman 2022 年 9 月 22 日 go routine |
17 shawndev 2022 年 9 月 22 日 堪比 ddos |
18 sadfQED2 2022 年 9 月 22 日 ``` var client *http.Client = &http.Client{ Timeout: time.Second * 5, } func check_url(url string) { go func() { req, _ := http.NewRequest("GET", url, nil) req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36") resp, err := client.Do(req) if err == nil { defer resp.Body.Close() status := resp.Status if strings.Contains(status, "200") { fmt.Println(url, "===请求成功===") } } }() } ``` 试试这个?你每次都 new 一个 httpclient 我记得好像是不能用上 keepalive 的,使用同一个 client ,保证 keepalive 。然后开协程疯狂请求就完事了。 但是你确定服务器扛得住? |
19 aino 2022 年 9 月 22 日 go 同时发起几万个 get 请求并发这么猛的吗,请教下 java 能做到吗,具体怎么做呢 |
20 biuyixia OP
|