プロデューサーの寿命が短い場合に Go ゴルーチンのデッドロックを回避するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-10-25 07:09:02
オリジナル
792 人が閲覧しました

How to Avoid Deadlock in Go Goroutines When Producers Are Short-Lived?

Go ゴルーチンのデッドロックの解決

同時プログラミングでは、複数のゴルーチンが互いの操作の完了を無期限に待機し、事実上、プログラム。この記事では、元の質問で説明したように、Go の同時実行で発生した特定のデッドロックに対処します:

<code class="go">package main

import (
    "fmt"
    "time"
)

func producer(ch chan int, d time.Duration, num int) {
    for i := 0; i < num; i++ {
        ch <- i
        time.Sleep(d)
    }
}

func main() {
    ch := make(chan int)
    go producer(ch, 100*time.Millisecond, 2)
    go producer(ch, 200*time.Millisecond, 5)
    for {
        fmt.Println(<-ch)
    }
    close(ch)
}</code>
ログイン後にコピー

このコードは、次の要因によりデッドロック エラーをトリガーします:

  • プロデューサーチャネルに値を送信するものは、有効期間が短く、最終的にはデータの生成を停止します。
  • main 関数の無限 for ループは、終了条件なしでチャネルから値を継続的に受信します。
  • 無限ループの後にチャネルが閉じられるため、それ以上受信できる値はなくなります。

解決策: 調整された終了

デッドロックを回避するには、プロデューサーは次のことを行う必要があります。完了を通知するように調整され、チャネルは最後のプロデューサーによって閉じられる必要があります。調整に sync.WaitGroup を使用した効率的なソリューションを次に示します。

<code class="go">func producer(ch chan int, d time.Duration, num int, wg *sync.WaitGroup) {
    defer wg.Done()
    for i := 0; i < num; i++ {
        ch <- i
        time.Sleep(d)
    }
}

func main() {
    wg := &sync.WaitGroup{}
    ch := make(chan int)

    wg.Add(1)
    go producer(ch, 100*time.Millisecond, 2, wg)
    wg.Add(1)
    go producer(ch, 200*time.Millisecond, 5, wg)

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

    for v := range ch {
        fmt.Println(v)
    }
}</code>
ログイン後にコピー

このソリューションでは:

  • 各プロデューサーの WaitGroup をインクリメントします。
  • 各プロデューサーdefer ステートメントを通じて完了時に WaitGroup をデクリメントします。
  • ゴルーチンは、WaitGroup がゼロになるまで待機し (すべてのプロデューサーが完了することを意味します)、チャネルを閉じます。
  • メイン ループは for 範囲を使用します。チャネルを閉じる前に、チャネル上で送信された値を反復処理する構造。

以上がプロデューサーの寿命が短い場合に Go ゴルーチンのデッドロックを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!