質問:
複数の HTTP 呼び出しを処理するツールを構築しています。同時ゴルーチンで。無期限の実行シナリオを防ぐために、特定の時間が経過した後に goroutine をキャンセルする方法を探します。
解決策:
スリープする goroutine を作成するアプローチ指定された期間、ブロードキャスト メッセージを送信して他のゴルーチンをキャンセルするのは論理的ですが、このゴルーチンの実行に問題があるようです。 scenario.
この課題に対処するには、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 ミリ秒後、コンテキストがキャンセルされ、ゴルーチンが終了して「canceled.」と出力されます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3