実行時間を制御するために 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) }
このコード内:
以上がGo でゴルーチンを正常にタイムアウトするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。