ホームページ >バックエンド開発 >Golang >Go で WaitGroup.Wait() にタイムアウトを追加する方法は?

Go で WaitGroup.Wait() にタイムアウトを追加する方法は?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-21 06:03:09743ブラウズ

How to Add a Timeout to WaitGroup.Wait() in Go?

永遠に待つことにうんざりしていませんか? WaitGroup.Wait() へのタイムアウトの追加

WaitGroup.Wait() を使用してゴルーチンを同期し、それらの実行が確実に完了するようにする場合、特定の期間後に待機を終了する機能が必要になる場合があります。これにより、タスクを決して完了しない可能性のある誤ったワーカーにシステムが際限なく依存することがなくなります。

時間指定待機グループの実用的なソリューション

タイムアウトを実装する 1 つのアプローチには、ゴルーチン、チャネル、時間パッケージの組み合わせ。アイデアは、すべてのゴルーチンの完了時にシグナルを受信するチャネルを作成することです。同時に、タイマーが希望のタイムアウト期間で初期化されます。 select ステートメントは、チャネルとタイマーの両方を監視するために使用されます。

import (
    "sync"
    "time"
)

func task(wg *sync.WaitGroup) {
    // Perform some task...
    time.Sleep(time.Second * 2)
    wg.Done()
}

func main() {
    var wg sync.WaitGroup
    wg.Add(2)
    go task(&wg)
    go task(&wg)

    ch := make(chan struct{})
    defer close(ch)

    go func() {
        defer wg.Done()
        wg.Wait()
        close(ch)
    }()

    timeout := 5*time.Second

    select {
    case <-ch:
        fmt.Println("All jobs completed within timeout.")
    case <-time.After(timeout):
        fmt.Println("Timeout reached, not all jobs completed.")
    }
}

ヘルパー関数によるタイムアウトの簡素化

より便利で再利用可能なアプローチを提供するには、この機能をカプセル化するヘルパー関数の作成を検討してください:

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
    case <-time.After(timeout):
        return true
    }
}

This helper function WaitGroup と希望のタイムアウト期間を受け入れ、待機が指定された制限を超えたかどうかを返します。

ヘルパー関数の使用法

ヘルパー関数の使用方法は簡単です。

if waitTimeout(&wg, 5*time.Second) {
    fmt.Println("Timeout reached waiting for wait group.")
}

この例では、待機グループに 5 より長い時間がかかる場合、waitTimeout 関数は true を返します。完了までに秒数かかり、タイムアウトが発生したことを示します。

以上がGo で WaitGroup.Wait() にタイムアウトを追加する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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