あなたの目標は、Go でゴルーチンを利用してアイテムを並列処理し、その結果を収集することです。スライスに。ただし、複雑なデッドロック エラーが発生しました: 「すべてのゴルーチンがスリープ状態です - デッドロック!」
このエラーは、コード内の 2 つの問題に起因します:
これらの問題を修正するには、ワーカーの終了時にチャネルを非同期で閉じるゴルーチンを導入します。
for i, line := range contents { wg.Add(1) go newSample(line, *replicatePtr, *timePtr, sampleChan, &wg) } go func() { wg.Wait() close(sampleChan) }() for s := range sampleChan { .. }
最適な効率を得るために固定数のワーカーが必要な場合は、次のようにコードをリファクタリングします。
for i, line := range contents { wg.Add(1) go func(line string) { defer wg.Done() sampleChan <- newSample(line, *replicatePtr, *timePtr) }(line) }
これにより、同時実行プリミティブがまとめられ、さまざまな同時実行パターンのリファクタリングが簡素化されます。
以上が並列処理と結果収集にゴルーチンを使用するときにデッドロックを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。