ホームページ >バックエンド開発 >Golang >Go で WaitGroup.Wait() の時間指定待機を実装する方法は?

Go で WaitGroup.Wait() の時間指定待機を実装する方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-03 21:00:19900ブラウズ

How to Implement a Timed Wait for WaitGroup.Wait() in Go?

WaitGroup.Wait() の時間指定待機

Go では、WaitGroup タイプを使用して、すべてのゴルーチンがタスクを完了するまで複数のゴルーチンを同期します。 。 WaitGroup.Wait() メソッドは、グループのすべてのメンバーが完了を通知するか、コンテキストがキャンセルされるまでブロックします。

ただし、スケジューラが実行されないように、WaitGroup 待機操作にタイムアウトを課すことが望ましい場合があります。誤った労働者を無期限に待つ必要がなくなります。これにより、このようなエラーが存在する場合のシステムの信頼性と回復可能性に関する哲学的な疑問が生じますが、この議論はこの質問の範囲を超えています。

解決策

提供されているソリューションは、チャネルと select ステートメントを利用してタイムアウト機能を実現します。

c := make(chan struct{})
go func() {
    defer wg.Done()
    // Do the work
    c <- struct{}{}
}()
select {
case <-c:
    // Work completed
case <-time.After(timeout):
    // Timed out
}

このソリューションは効果的ですが、複雑すぎるように見えるかもしれません。次のヒントでこの問題を改善できます。

  • チャネルで値を送信する代わりに、チャネル クロージャを使用して完了を通知することを検討してください。閉じられたチャネルからの読み取りは、常に直ちに続行されます。
  • 完了を通知するには defer ステートメントを使用します。関数が突然終了した場合でも実行されます。
  • 待機するジョブが 1 つだけの場合は、WaitGroup を省略し、チャネルを直接使用します。
  • タイムアウトの場合は、期間を直接指定します。例: timeout := time.Second (または 2 秒の場合は 2 * time.Second)

ヘルパー関数

プロセスを簡略化するために、タイムアウト ロジックをカプセル化するヘルパー関数を作成できます:

func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool {
    c := make(chan struct{})
    go func() {
        defer close(c)
        wg.Wait()
    }()
    select {
    case <-c:
        return false // Completed normally
    case <-time.After(timeout):
        return true // Timed out
    }
}

この関数はタイムアウト機能をラップしており、 use:

if waitTimeout(&wg, time.Second) {
    fmt.Println("Timed out waiting for wait group")
} else {
    fmt.Println("Wait group finished")
}

このアプローチは、WaitGroup.Wait() 操作のタイムアウトを処理するためのよりクリーンで便利な方法を提供します。

以上がGo で WaitGroup.Wait() の時間指定待機を実装する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。