ホームページ > バックエンド開発 > Golang > タイムアウトが発生したときに Go で HTTP リクエストを効果的にキャンセルするにはどうすればよいですか?

タイムアウトが発生したときに Go で HTTP リクエストを効果的にキャンセルするにはどうすればよいですか?

Patricia Arquette
リリース: 2024-10-29 18:11:04
オリジナル
903 人が閲覧しました

How can I effectively cancel HTTP requests in Go when a timeout occurs?

Goroutine のタイムアウトについて

提供されたコードでは、findCicCode() 関数の結果またはタイムアウトを処理する select ステートメントを使用してタイムアウト メカニズムを実装しました。 50ミリ秒。ただし、タイムアウト後も HTTP 呼び出しが実行され続ける場合、リソース漏洩の可能性について懸念を表明しました。

HTTP リクエストのキャンセルにコンテキストを利用する

この問題に対処するには、 Go におけるコンテキストの概念。コンテキストは、コンテキスト固有の値をゴルーチンに関連付ける方法を提供し、キャンセルを可能にします。コンテキストを使用すると、タイムアウトが発生したときに進行中の HTTP 呼び出しをキャンセルできます。

HTTP リクエストのコンテキスト キャンセルを実装する方法の例を次に示します。

<code class="go">package main

import (
    "context"
    "fmt"
    "net/http"
    "time"
)

type Response struct {
    data   interface{}
    status bool
}

func Find() (interface{}, bool) {
    ch := make(chan Response, 1)

    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel() // Ensure cancelation when the function exits

    go func() {
        data, status := findCicCode(ctx)
        ch <- Response{data: data, status: status}
    }()

    select {
    case response := <-ch:
        return response.data, response.status
    case <-time.After(50 * time.Millisecond):
        return "Request timed out", false
    }
}

func main() {
    data, timedOut := Find()
    fmt.Println(data, timedOut)
}</code>
ログイン後にコピー

この変更されたコードでは、

  • context.Context はキャンセル関数とともに作成されます。
  • タイムアウトが発生した場合、進行中のリクエストをキャンセルするために findCicCode() 関数が ctx に渡されます。
  • それぞれfindCicCode() 関数内で作成された HTTP リクエストには、req.WithContext(ctx) を使用して ctx が割り当てられます。
  • タイムアウトが発生すると、cancel 関数が呼び出され、ctx に関連付けられた進行中のすべての HTTP リクエストがキャンセルされます。 .

このアプローチを使用すると、タイムアウトに達したときに進行中の HTTP リクエストが確実にキャンセルされ、不必要なリソースの消費が防止されます。

以上がタイムアウトが発生したときに Go で HTTP リクエストを効果的にキャンセルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート