ホームページ > バックエンド開発 > Golang > Go でゴルーチンを正常にタイムアウトするにはどうすればよいですか?

Go でゴルーチンを正常にタイムアウトするにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-19 11:56:02
オリジナル
1038 人が閲覧しました

How to Gracefully Timeout Goroutines in Go?

実行時間を制御するために Go で Goroutines をタイムアウトする方法

Go 同時実行の不可欠な部分である Goroutines により、タスクの非同期実行が可能になります。ただし、場合によっては、これらのルーチンの継続時間を制御して、それらが無期限に実行されないようにする必要があります。

背景と問題

負荷テスト ツールでは、次のことを行う必要があります。 HTTP 呼び出しプロセスの継続時間を制限するために、指定された時間が経過した後にゴルーチンを終了します。 goroutine 内で time.Sleep() を使用する現在のアプローチでは、通信用のチャネルが作成されますが、goroutine が途中で終了してしまいます。

Context を使用した解決策

詳細推奨されるアプローチには、 golang.org/x/net/context パッケージ ( Go 1.7 の標準ライブラリで利用可能)、特に context.Context インターフェースの利用が含まれます。コンテキストは、ゴルーチンをキャンセルまたはタイムアウトするためのメカニズムを提供します。

次のコード スニペットは、このソリューションを示しています。

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)
}
ログイン後にコピー

このコード内:

  • コンテキスト。 context.WithTimeout() を使用して、50 ミリ秒のタイムアウトでコンテキストが作成されます。
  • test() ゴルーチンはこのコンテキストで実行され、select による指示を待ちます。
  • タイムアウトが経過すると、select は受信します。 ctx.Done() シグナルを送信してゴルーチンを正常に終了し、寝坊を防ぎます。

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

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