API呼び出しがhttp要求の場合、タイムアウトを実装する最も良い方法は、httpクライアント自体にAPI呼び出しを指定することです。そうすれば、http.Get(url)
はタイムアウトし、適切に処理できるエラーを返します。デフォルトのhttpクライアントのタイムアウトは非常に長く、アプリケーションがハングアップする可能性があります。これを書き直すにはthisを読んでください。
apiCall1()
の実装例です。応答が10秒以内に受信されなかった場合のタイムアウトを含むエラーが返されます。
func apiCall1() error {
var netClient = &http.Client{
Timeout: time.Second * 10,
}
resp, err := netClient.Get("http://someurl.com/apiEndpoint")
if err != nil {
return err
}
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("http request returned code %d", resp.StatusCode)
}
return handleResponse(resp) // Return error if there is one, nil if not.
}
func handleResponse(resp *http.Response) error {
...
}
apiCall1()
に電話すると、エラーを処理できます。
if err := apiCall1(); err != nil {
log.Print(err)
}
質問の同時実行性の側面は少し不明であるが、私はいくつかのアイデアを持つ2つの箇条書きを残しておきます:
タイムアウトすることはできますか?それぞれの個別の電話は? –
https://gobyexample.com/timeouts – dm03514
はい、私はそれぞれの呼び出しをタイムアウトしたいと思います – donfrigo