永遠に待つことにうんざりしていませんか? 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 サイトの他の関連記事を参照してください。