ホームページ  >  記事  >  バックエンド開発  >  Goroutine 同期のためにチャネルではなく `sync.WaitGroup` を選択するのはどのような場合ですか?

Goroutine 同期のためにチャネルではなく `sync.WaitGroup` を選択するのはどのような場合ですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-14 22:47:02237ブラウズ

When to Choose `sync.WaitGroup` over Channels for Goroutine Synchronization?

Sync.WaitGroup: ゴルーチン同期用のチャネルの効率的な代替手段

Go でゴルーチンを同期する場合、通常、sync.WaitGroup とチャネルの両方が使用されたパターン。どちらの方法でも同様の結果が得られますが、特定の状況では sync.WaitGroup の方が適切な選択肢となる微妙な利点があります。

次のシナリオを考えてみましょう。

// Waitgroup example
package main

import (
    "fmt"
    "sync"
    "time"
)

var wg sync.WaitGroup

func main() {
  words := []string{"foo", "bar", "baz"}

  for _, word := range words {
    wg.Add(1)
    go func(word string) {
      //...
      fmt.Println(word)
      wg.Done()
    }(word)
  }
}

この場合、同期は.WaitGroup は、実行中のゴルーチンの数を追跡し、すべてのゴルーチンが完了するのを待ってからさらにコードを実行するための便利なメカニズムを提供します。これにより、次に進む前にすべてのタスクが完了していることを簡単に確認できます。

逆に、このタスクにチャネルを使用すると、より複雑でエラーが発生しやすくなります。

// Channel example
package main

import (
    "fmt"
    "time"
)

func main() {
    words := []string{"foo", "bar", "baz"}
    done := make(chan bool, len(words))
    for _, word := range words {
        //...
        fmt.Println(word)
        done <- true
    }
    for range words {
        <-done
    }
}

ここでは、完了しましたチャネルは各タスクの完了を通知するために使用され、メイン関数はすべての信号が受信されるまでブロックされます。このアプローチは機能的には sync.WaitGroup と同等ですが、すべてのゴルーチンが適切に同期されていることを確認するために追加のブックキーピングとエラー処理が必要です。

一般に、主な関心事が実行の完了を調整することである場合には、sync.WaitGroup が推奨されます。一方、チャネルは、ゴルーチン間のデータ交換を伴うシナリオや、同期のきめ細かい制御が必要な場合に適しています。特定の要件でチャネルの使用が必要でない限り、sync.WaitGroup は goroutine 同期タスクのためのよりシンプルでパフォーマンスの高いソリューションを提供します。

以上がGoroutine 同期のためにチャネルではなく `sync.WaitGroup` を選択するのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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