コンテキストを使用して設定時間が経過した後にゴルーチンを正常に停止するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-20 14:48:18
オリジナル
770 人が閲覧しました

How to Gracefully Stop Goroutines After a Set Time Using Context?

コンテキストを使用して指定した期間後にゴルーチンを停止する方法

問題の背景

負荷テストでは、多数の HTTP 呼び出しがゴルーチンで調整され、次のようになります。これらのルーチンの実行時間を制御するために重要です。これにより、ユーザーは事前定義された時間に負荷テストを終了できます。

失敗したアプローチ

これを達成するための一般的な試みの 1 つは、ゴルーチンを使用して time.Sleep() の継続時間とブロードキャスト終了信号を監視することです。チャンネル経由で。特定のケースではこの方法で十分かもしれませんが、ゴルーチンがメインのゴルーチンの外で HTTP 呼び出しを実行し続ける場合は失敗します。

解決策: コンテキストの使用

Go 1.7 では、この問題に対処するために必須のコンテキスト パッケージが導入されています。 。コンテキストは、ゴルーチンの実行をキャンセルおよび監視するための構造化された方法を提供し、時間ベースの終了のための信頼できるソリューションを提供します。

package main

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

func test(ctx context.Context) {
    t := time.Now()

    select {
    case <-time.After(1 * time.Second):
        fmt.Println("overslept")
    case <-ctx.Done():
    }
    fmt.Println("used:", time.Since(t))
}

func main() {
    ctx, _ := context.WithTimeout(context.Background(), 50*time.Millisecond)
    test(ctx)
}
ログイン後にコピー

説明:

  1. テスト関数内では、次のコンテキストが使用されます。 50 ミリ秒のタイムアウトが作成されます。
  2. select ステートメントは、time.After チャネルにイベントがあるかどうかを確認します。 (スリープの完了を示す) またはコンテキストがキャンセルされた場合。
  3. コンテキストがタイムアウトすると、select ステートメントは終了し、ゴルーチンがキャンセルされたことを示します。

このアプローチにより、次のことが保証されます。ゴルーチンは、コード内の位置に関係なく、指定された時間が経過するとキャンセルされます。

以上がコンテキストを使用して設定時間が経過した後にゴルーチンを正常に停止するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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