sync.WaitGroup
を使用して複数のゴルチンが完了するのを待つには、次の手順に従います。
Waitgroupの初期化:まず、 sync.WaitGroup
のインスタンスを作成する必要があります。これは通常、単純な宣言を使用して行われます。
<code class="go">var wg sync.WaitGroup</code>
WaitGroupに追加:ゴルチンを起動する前に、開始する各ゴルチンのウェイトグループカウンターを増やします。これは、待機groutinesが何回待つ必要があるかを示しています。
<code class="go">wg.Add(1)</code>
Goroutinesを開始:ゴルウチン関数では、延期ステートメントを使用して、ゴルウチンが完了したときにカウンターを減少させます。これにより、パニックのためにゴルウチンが時期尚早に終了する場合でも、カウンターが減少することが保証されます。
<code class="go">go func() { defer wg.Done() // Goroutine work here }()</code>
完了を待つ:すべてのゴロウチンを起動した後、WaitGroupでWait()
を呼び出します。これにより、カウンターがゼロになるまでメインゴルウチンの実行がブロックされます。つまり、追跡されたすべてのゴロウチンが完了しました。
<code class="go">wg.Wait()</code>
これが完全な例です:
<code class="go">package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup for i := 1; i </code>
sync.WaitGroup
を使用する場合、避けるべきいくつかの一般的な落とし穴があります。
Add
を忘れて: Add
を呼び出す前にゴロウチンを起動する場合、ウェイトグループカウンターは待機する正しい数のゴルチンを反映していないため、 Wait()
コールの早期終了につながります。Add
とDone
:すべてのAdd(1)
コールに対応するDone()
呼び出しがあることを確認してください。これらが不一致の場合、プログラムは無期限にハングするか、 Wait()
早期に戻ります。Add
およびDone
レース条件: Wait
でAdd
または同時にDone
ように注意してください。よくある間違いは、 Done
ゴルチンを起動した後にAdd
を呼び出すことです。Done
にdefer
を使用していない:Goroutineの開始時にdefer wg.Done()
を使用することをお勧めします。これにより、Goroutineパニックであっても、 Done
呼び出されることが保証されます。 sync.WaitGroup
、複数のゴルチンの完了を同期するための簡単なメカニズムを提供することにより、同時操作のライフサイクルを管理するのに役立ちます。それがどのように役立つかは次のとおりです。
sync.WaitGroup
、メインのゴルウチンがすべての産卵したゴルチンが進む前にタスクを完了するのを待つことを保証します。これは、同時プログラムで正しい運用順序を維持するために重要です。sync.WaitGroup
これらのゴルチンのライフサイクルを管理するのに役立ちます。これにより、プログラムはすべての操作がいつ終了するかを知ることができます。これは、クリーンアップ、リソースのリリース、またはさらに処理に不可欠です。sync.WaitGroup
自体はエラーを処理しませんが、すべてのゴルチンが終了した後に個々のゴルチンからのエラーを収集および処理できる並行性に対する構造化されたアプローチを容易にします。sync.WaitGroup
ゴルチンの数とよくスケーリングします。 2〜2,000個のゴルウチンがあるかどうかにかかわらず、メカニズムは同じままであり、小さなスクリプトから大規模なシステムに至るまでのアプリケーションに適しています。 GOプログラムでsync.WaitGroup
初期化して使用するときのベストプラクティスに従うことで、効率的かつ正しい並行性管理を確保できます。これが重要なプラクティスです:
waitgroupをローカルに初期化: sync.WaitGroup
を初期化する関数またはスコープ内で必要な場合。これにより、偶発的な再利用と潜在的な人種条件の可能性が減ります。
<code class="go">func someFunction() { var wg sync.WaitGroup // Use wg within this function }</code>
Goroutinesを開始する前にAdd
を使用してください:ゴルウチンを開始する前に、必ずAdd
を呼び出してください。これによりAdd
が呼び出される前にゴロウチンが終了する可能性のある人種条件を回避します。
<code class="go">wg.Add(1) go func() { defer wg.Done() // Goroutine work }()</code>
延期Done
通話:ゴルチンの先頭にdefer wg.Done()
を使用して、たとえゴルウチンパニックであっても、呼び出されていることを確認してください。
<code class="go">go func() { defer wg.Done() // Goroutine work }()</code>
sync.WaitGroup
がライフサイクルを完了したら(つまり、 Wait
が戻った後)、再利用しないでください。 Goroutinesの新しいセット用に新しいsync.WaitGroup
を作成します。エラーの処理: Wait
が戻った後、ゴルチンからエラーを収集して処理します。チャネルまたはその他の同期メカニズムを使用して、エラーをメインゴルチンに戻すことができます。
<code class="go">errors := make(chan error, len(workers)) for _, worker := range workers { wg.Add(1) go func(w Worker) { defer wg.Done() if err := w.DoWork(); err != nil { errors </code>
これらのベストプラクティスに従うことにより、 sync.WaitGroup
効果的に使用してGOの同時操作を管理し、プログラムが堅牢で信頼性が高いことを確認できます。
以上がsync.waitgroupを使用して、複数のゴルチンが完了するのを待つ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。