我在Go中做了一个URL抓取器,并且有一个要抓取的URL列表。我向每个URL发送http.Get()
请求并获得它们的响应。
resp,fetch_err := http.Get(url)
如何为每个Get请求设置自定义超时?(默认时间非常长,这使得我的抓取器非常慢。)我希望我的抓取器有一个大约40-45秒的超时,在此之后它应该返回“请求超时”并移动到下一个URL。
我如何才能做到这一点?
发布于 2014-08-17 06:10:18
显然,在Go 1.3中,http.Client有超时字段
client := http.Client{
Timeout: 5 * time.Second,
}
client.Get(url)
这对我来说是个好把戏。
发布于 2013-06-05 10:33:38
为了补充Volker的回答,如果除了连接超时之外,您还想设置读/写超时,您可以执行如下操作
package httpclient
import (
"net"
"net/http"
"time"
)
func TimeoutDialer(cTimeout time.Duration, rwTimeout time.Duration) func(net, addr string) (c net.Conn, err error) {
return func(netw, addr string) (net.Conn, error) {
conn, err := net.DialTimeout(netw, addr, cTimeout)
if err != nil {
return nil, err
}
conn.SetDeadline(time.Now().Add(rwTimeout))
return conn, nil
}
}
func NewTimeoutClient(connectTimeout time.Duration, readWriteTimeout time.Duration) *http.Client {
return &http.Client{
Transport: &http.Transport{
Dial: TimeoutDialer(connectTimeout, readWriteTimeout),
},
}
}
这段代码已经过测试,并在生产环境中运行。有关测试的完整要点可在此处https://gist.github.com/dmichael/5710968获得
请注意,您将需要为每个请求创建一个新的客户端,因为conn.SetDeadline
引用了来自time.Now()
的未来点
发布于 2018-08-28 05:41:47
如果您想对每个请求执行此操作,为简洁起见,请忽略错误处理:
ctx, cncl := context.WithTimeout(context.Background(), time.Second*3)
defer cncl()
req, _ := http.NewRequestWithContext(ctx, http.MethodGet, "https://google.com", nil)
resp, _ := http.DefaultClient.Do(req)
https://stackoverflow.com/questions/16895294
复制相似问题