ホームページ > バックエンド開発 > Golang > Go の「context」パッケージを使用してゴルーチンをタイムアウトするにはどうすればよいですか?

Go の「context」パッケージを使用してゴルーチンをタイムアウトするにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-20 04:36:02
オリジナル
812 人が閲覧しました

How Can Go's `context` Package Be Used to Timeout Goroutines?

Go はゴルーチンのタイムアウトをどのように処理しますか?

質問:

複数の HTTP 呼び出しを処理するツールを構築しています。同時ゴルーチンで。無期限の実行シナリオを防ぐために、特定の時間が経過した後に goroutine をキャンセルする方法を探します。

解決策:

スリープする goroutine を作成するアプローチ指定された期間、ブロードキャスト メッセージを送信して他のゴルーチンをキャンセルするのは論理的ですが、このシナリオではゴルーチンの実行に問題があるようです。

この課題に対処するには、Go のコンテキスト パッケージを活用することを検討してください。 。これは、ゴルーチンのタイムアウトとコンテキストのキャンセルを処理する効果的な方法を提供します。

コード スニペット:

ゴルーチンのタイムアウト管理にコンテキスト パッケージを使用する例を次に示します。

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("cancelled")
    }
    fmt.Println("used:", time.Since(t))
}

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)

    go test(ctx)

    // cancel context after 30 milliseconds
    time.Sleep(30 * time.Millisecond)
    cancel()
}
ログイン後にコピー

このコードは、50 ミリ秒のタイムアウトを持つコンテキストを作成します。次に、ゴルーチンが起動されてテスト関数が実行され、コンテキストが渡されます。テスト関数内で、select ステートメントは、タイムアウトが発生するか、コンテキストがキャンセルされるまで待機します。 30 ミリ秒後、コンテキストがキャンセルされ、ゴルーチンが終了して「キャンセル済み」と出力されます。

以上がGo の「context」パッケージを使用してゴルーチンをタイムアウトするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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