ホームページ >バックエンド開発 >Golang >Go の `sync.WaitGroup` で正確にカウントするには `wg.Add()` をどこに配置する必要がありますか?

Go の `sync.WaitGroup` で正確にカウントするには `wg.Add()` をどこに配置する必要がありますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-28 07:15:30208ブラウズ

  Where Should You Place `wg.Add()` for Accurate Counting in Go's `sync.WaitGroup`?

正確なカウントのための待機グループの配置

同時プログラミングでは、sync.WaitGroup 型はゴルーチンを調整するための同期プリミティブとして機能します。 wg.Wait() へのブロッキング呼び出しを続行する前に完了する必要があるタスクの数を追跡します。

wg.Add() の適切な配置

Toタスクを正確にカウントするには、後で wg.Done() を呼び出す goroutine を起動する前に、wg.Add(1) を呼び出すことが重要です。この配置により、起動されたすべてのゴルーチンが完了するまで、メインのゴルーチンが wg.Wait() でブロックされることが保証されます。

代替配置の結果

コード例で示すように、 wg.Add(1) をゴルーチン内に配置すると、wg.Wait() が途中で完了する可能性があります。これは、同じゴルーチン内で、wg.Add(1) の直後に wg.Done() が呼び出され、すべてのタスクが完了する前にメインのゴルーチンが実行を再開するために発生します。

Deterministic Completion

ゴルーチンの起動前に wg.Add() が正しく配置されている場合、メインのゴルーチンは for ループが終わるまで wg.Wait() に到達できません。これにより、wg.Add() が正確に 100 回呼び出されることになり、wg.Done() が 100 回呼び出されるまで wg.Wait() がブロックされます。

Alternatives

別の方法として、ループの反復回数が事前にわかっている場合は、ループの前に wg.Add(100) を呼び出すことができます。ただし、ループ内で条件付きスキップが行われないことを前提としているため、このアプローチは慎重に使用する必要があります。

ベスト プラクティス

sync.WaitGroup を一貫して信頼性の高い方法で使用するには、次のガイドラインに従ってください:

  1. 新しいゴルーチンを開始する前に、メインのゴルーチンで wg.Add() を呼び出します。
  2. ゴルーチン内で遅延された wg.Done() を呼び出して、ゴルーチン内でも確実に完了します。パニックの場合。
  3. 関数間で WaitGroup を共有する場合は、コピーの作成を避けるために WaitGroup へのポインタを渡します。

以上がGo の `sync.WaitGroup` で正確にカウントするには `wg.Add()` をどこに配置する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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