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>
このコードは、次の要因によりデッドロック エラーをトリガーします:
解決策: 調整された終了
デッドロックを回避するには、プロデューサーは次のことを行う必要があります。完了を通知するように調整され、チャネルは最後のプロデューサーによって閉じられる必要があります。調整に 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>
このソリューションでは:
以上がプロデューサーの寿命が短い場合に Go ゴルーチンのデッドロックを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。