目次
コンテキストの概要
コンテキストを使用してリクエストの同時実行制御を実装する手順
サンプル コード
概要
ホームページ バックエンド開発 Golang コンテキストを使用して Go でリクエストの同時実行制御を実装する方法

コンテキストを使用して Go でリクエストの同時実行制御を実装する方法

Jul 22, 2023 am 09:03 AM
コントロール 同時 context

高性能プログラミング言語として、Go 言語は常に同時プログラミング能力において優れています。同時リクエストをより適切に管理および制御するために、Go 言語ではコンテキストを使用してリクエストの同時実行制御を実装できます。この記事では、コンテキストを使用して Go 言語でリクエストの同時実行制御を実装する方法を紹介し、コード例を通じてそれを示します。

コンテキストの概要

Go 言語では、コンテキスト パッケージは衝突リクエストを管理する方法を提供します。期限、タイムアウト、キャンセル信号などを含むリクエスト全体のデータをゴルーチン間で受け渡すことができます。コンテキストを使用することで、同時リクエストをより適切に管理および制御できます。

コンテキストを使用してリクエストの同時実行制御を実装する手順

コンテキストを使用してリクエストの同時実行制御を実装する手順は次のとおりです:

  1. ルート コンテキストを作成します。ルートコンテキストを作成する必要があります。ルート コンテキストは、すべての子コンテキストの親コンテキストです。 context.TODO() または context.Background() を使用して、空のルート コンテキストを作成できます。
ctx := context.TODO()
ログイン後にコピー
  1. サブコンテキストの作成: 次に、context.WithXXX() 関数を使用してサブコンテキストを作成します。この関数は、親コンテキストをパラメータとして受け取り、新しい子コンテキストを返します。
childCtx := context.WithTimeout(ctx, time.Second*10)
ログイン後にコピー

上記のコードでは、context.WithTimeout() 関数を使用して、タイムアウトが 10 秒のサブコンテキストを作成します。

  1. リクエストの処理: 特定のリクエストを処理するとき、context.Context 型パラメータを使用して、渡されたコンテキストを受け取ることができます。リクエストの処理プロセス中に、context.Context メソッドを使用してコンテキスト関連の情報を取得できます。
func HandleRequest(ctx context.Context) {
    // 处理请求
}
ログイン後にコピー
  1. 同時実行性の制御: 同時リクエストを行う場合、context.Context の Done() メソッドを使用して、リクエストがキャンセルされたかタイムアウトしたかを判断できます。 。 Done() メソッドが呼び出されると、読み取り専用の Channel が返されます。リクエストがキャンセルされるかタイムアウトになると、Done() メソッドはチャネルを閉じます。
go func() {
    for {
        select {
        case <-ctx.Done():
            return
        default:
            // 发起请求
            HandleRequest(ctx)
        }
    }
}()
ログイン後にコピー

上記のコードでは、for ループと select ステートメントを使用して、コンテキストの Done() メソッドを監視します。 Done() メソッドが返されると、リクエストがキャンセルされたかタイムアウトになったことがわかり、ループを終了できます。

  1. リクエストのキャンセル: 場合によっては、処理中のリクエストをキャンセルしたいことがあります。この時点で、context.CancelFunc 型の cancel() メソッドを呼び出してリクエストをキャンセルできます。
cancel()
ログイン後にコピー

上記のコードでは、cancel() メソッドを呼び出してリクエストをキャンセルします。

サンプル コード

次に、コンテキストを使用してリクエストの同時実行制御を実装する方法を示す簡単なサンプル コードを示します。

package main

import (
    "context"
    "fmt"
    "sync"
    "time"
)

func Worker(ctx context.Context, wg *sync.WaitGroup) {
    defer wg.Done()
 
    for {
        select {
        case <-ctx.Done():
            // 请求已被取消或超时
            return
        default:
            // 处理请求
            fmt.Println("Handling request...")
            time.Sleep(time.Second * 1)
        }
    }
}

func main() {
    ctx := context.TODO()
    childCtx, cancel := context.WithTimeout(ctx, time.Second*5)
    defer cancel()

    var wg sync.WaitGroup
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go Worker(childCtx, &wg)
    }

    wg.Wait()
    fmt.Println("All requests processed")
}
ログイン後にコピー

上記のコードでは、タイムアウトが 5 秒のルート コンテキストと子コンテキストを作成します。次に、リクエストを処理するための 5 つの goroutine を作成しました。リクエストの処理プロセス中に、コンテキストの Done() メソッドを使用して、リクエストがキャンセルされたかタイムアウトしたかを判断します。最後に、sync.WaitGroup を使用して、すべてのリクエストが処理されるのを待ちます。

概要

コンテキストを使用すると、同時リクエストをより適切に管理および制御できます。この記事では、コンテキストを使用してリクエストの同時実行制御を実装する手順を紹介し、サンプル コードを使用してそれを示します。読者は、この記事の紹介とサンプル コードを通じて、リクエストの同時実行制御を実現するためのコンテキストをよりよく理解し、適用できると信じています。

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java 関数の同時実行性とマルチスレッド化によってパフォーマンスはどのように向上するのでしょうか? Java 関数の同時実行性とマルチスレッド化によってパフォーマンスはどのように向上するのでしょうか? Apr 26, 2024 pm 04:15 PM

Java 関数の同時実行性とマルチスレッド化によってパフォーマンスはどのように向上するのでしょうか?

Golang API 設計における同時実行性とコルーチンの適用 Golang API 設計における同時実行性とコルーチンの適用 May 07, 2024 pm 06:51 PM

Golang API 設計における同時実行性とコルーチンの適用

iPhoneでコントロールセンターが機能しない:修正 iPhoneでコントロールセンターが機能しない:修正 Apr 17, 2024 am 08:16 AM

iPhoneでコントロールセンターが機能しない:修正

Go 同時関数の単体テストのガイド Go 同時関数の単体テストのガイド May 03, 2024 am 10:54 AM

Go 同時関数の単体テストのガイド

PHP マルチスレッド関数における同時実行性の問題の解決 PHP マルチスレッド関数における同時実行性の問題の解決 May 01, 2024 pm 09:45 PM

PHP マルチスレッド関数における同時実行性の問題の解決

Java 関数ライブラリで一般的に使用される同時実行ツールは何ですか? Java 関数ライブラリで一般的に使用される同時実行ツールは何ですか? Apr 30, 2024 pm 01:39 PM

Java 関数ライブラリで一般的に使用される同時実行ツールは何ですか?

Java データベース接続はトランザクションと同時実行をどのように処理しますか? Java データベース接続はトランザクションと同時実行をどのように処理しますか? Apr 16, 2024 am 11:42 AM

Java データベース接続はトランザクションと同時実行をどのように処理しますか?

Java 関数の同時実行性とマルチスレッドでアトミック クラスを使用するにはどうすればよいですか? Java 関数の同時実行性とマルチスレッドでアトミック クラスを使用するにはどうすればよいですか? Apr 28, 2024 pm 04:12 PM

Java 関数の同時実行性とマルチスレッドでアトミック クラスを使用するにはどうすればよいですか?

See all articles