146

Go で URL fetcher を作成していて、取得する URL のリストがあります。各 URL にリクエストを送信http.Get()し、そのレスポンスを取得します。

resp,fetch_err := http.Get(url)

Get リクエストごとにカスタム タイムアウトを設定するにはどうすればよいですか? (デフォルトの時間が非常に長いため、フェッチャーが非常に遅くなります。) フェッチャーに約 40 ~ 45 秒のタイムアウトを設定した後、「要求がタイムアウトしました」を返し、次の URL に移動する必要があります。

どうすればこれを達成できますか?

4

7 に答える 7

321

どうやらGo 1.3のhttp.ClientにはTimeoutフィールドがあります

client := http.Client{
    Timeout: 5 * time.Second,
}
client.Get(url)

これでうまくいきました。

于 2014-08-16T22:10:17.533 に答える
10

手早く汚い方法:

http.DefaultTransport.(*http.Transport).ResponseHeaderTimeout = time.Second * 45

これは、調整なしでグローバル状態を変更しています。それでも、あなたの URL fetcher にとっては問題ないかもしれません。それ以外の場合は、次のプライベート インスタンスを作成しますhttp.RoundTripper

var myTransport http.RoundTripper = &http.Transport{
        Proxy:                 http.ProxyFromEnvironment,
        ResponseHeaderTimeout: time.Second * 45,
}

var myClient = &http.Client{Transport: myTransport}

resp, err := myClient.Get(url)
...

上記のものはテストされていません。

于 2013-06-03T11:36:04.797 に答える