コンテキストを使用して Go でリクエストのキャンセルを実装する方法

PHPz
リリース: 2023-07-21 22:18:20
オリジナル
1385 人が閲覧しました

コンテキストを使用して Go でリクエストのキャンセルを実装する方法

Go 言語では、リクエストを送信して一定期間内にリクエストをキャンセルする必要がある状況によく遭遇します。これらのリクエストをより適切に管理および制御するために、Go 言語の標準ライブラリは強力なパッケージである「context」パッケージを提供します。この記事では、コンテキスト パッケージを使用して Go でリクエスト キャンセル機能を実装する方法と、対応するコード例を紹介します。

1. コンテキスト パッケージとは

Go 言語では、コンテキスト パッケージはリクエストのコンテキストを管理するために使用されるパッケージです。これは、リクエスト関連の値、タイムアウト、またはキャンセル信号を渡し、これらの値をリクエストに関連するすべての関数とメソッドに渡す方法を提供します。

コンテキスト パッケージには次のコア メソッドがあります:

  1. WithCancel(parent): キャンセル可能なサブコンテキストを作成します。コンテキストの cancel メソッドを呼び出してコンテキストをキャンセルし、すべての子コンテキスト;
  2. WithDeadline(parent, Deadline): 締め切り時間が到着すると自動的にキャンセルされる子コンテキストを作成します;
  3. WithTimeout(parent, timeout): 子を作成しますタイムアウト時間に到着するコンテキスト 自動的にキャンセルされるサブコンテキスト;
  4. Background(): 値やキャンセル信号なしでバックグラウンド コンテキストを作成します;
  5. TODO(): コンテキストを作成しますキャンセルには使用できませんが、主に今後の拡張に使用されます。

2. コンテキスト パッケージを使用してリクエスト キャンセルを実装する

以下では、コンテキスト パッケージを使用して Go 言語でリクエスト キャンセル機能を実装する方法を例を使用して示します。

  1. まず、「context」パッケージをインポートする必要があります。
import "context"
ログイン後にコピー
  1. 次に、 context.WithCancel メソッドを使用してキャンセル可能なコンテキストを作成し、コンテキストの cancel メソッドを通じてコン​​テキストをキャンセルできます。
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
ログイン後にコピー
  1. 次に、キャンセルする必要がある操作にパラメータとしてコンテキストを渡すことができます。たとえば、このコンテキストを使用して、HTTP リクエストの送信時にタイムアウトを設定し、タイムアウトになったらリクエストをキャンセルできます。
req, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://example.com", nil)
if err != nil {
    log.Fatal(err)
}

client := http.DefaultClient
resp, err := client.Do(req)
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()
ログイン後にコピー

上の例では、http.NewRequestWithContext メソッドを使用してタイムアウトのある HTTP リクエストを作成し、タイムアウトが発生したときにリクエストをキャンセルします。

  1. 最後に、cancel メソッドを呼び出して、リクエストをキャンセルする必要があるコンテキストをキャンセルできます。たとえば、HTTP リクエストを処理するゴルーチンでは、リクエストをキャンセルする必要があるかどうかを確認し、リクエストをキャンセルする必要がある場合は cancel メソッドを呼び出します。
go func() {
    // 处理HTTP请求
    select {
    case <-ctx.Done():
        // 请求已取消
        return
    default:
        // 继续处理请求
    }

    // ...
}()

// 取消请求
cancel()
ログイン後にコピー

上の例では、ctx.Done メソッドを呼び出してコンテキストがキャンセルされたかどうかを確認します。コンテキストがキャンセルされた場合は、ゴルーチンで対応するクリーンアップ操作を実行できます。

3. 概要

コンテキスト パッケージを使用すると、特にリクエストをキャンセルしたりタイムアウトを設定する必要がある場合に、リクエストをより適切に管理および制御するのに役立ちます。コンテキスト パッケージを使用してキャンセル可能なサブコンテキストを作成し、それをキャンセルまたはタイムアウトが必要な操作に渡すことができます。コンテキスト パッケージを合理的に使用することで、リクエストがタイムアウトまたはキャンセルされたときのリソースの無駄やブロックを回避できます。

上記は、コンテキストを使用して Go でリクエストのキャンセルを実装する方法の紹介です。この記事がコンテキスト パッケージの理解と使用に役立つことを願っています。

以上がコンテキストを使用して Go でリクエストのキャンセルを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!