Golang の並列処理: パフォーマンスのための同時実行性の活用
ゴルーチンを使用した並列処理を示す、提供されたコードを考えてみましょう。ただし、同時実行の可能性と並列処理を達成するための最適なアプローチについて疑問が生じます。
dowork の同時実行
dowork が並列で実行されるという前提は次のとおりです。保証されていません。ゴルーチンは軽量の同時実行メカニズムを提供しますが、実際の実行シーケンスは OS スケジューラーによって決定されます。 GoMAXPROCS は、Go 1.5 のリリース ノートによれば、通常、利用可能なコアと一致します。
推奨されるアプローチ: デッドロック防止と同時実行制御
メイン関数の実行の維持について, fmt.Scanln は、特に運用環境では信頼性が低い場合があります。代わりに、終了する前にすべての goroutine が確実に完了するように sync.WaitGroup を実装することを検討してください。さらに、同時実行制御を強化し、並列タスクの適切なリソース使用率を確保するには、ゴルーチンごとに個別の Dowork ワーカーのチャネルを利用することをお勧めします。
並列関数実行用のユーティリティ関数
並列関数の実行を簡素化するには、次のような既存のユーティリティ関数を利用できます:
<code class="go">import "sync" // Parallelize parallelizes function calls func Parallelize(functions ...func()) { var waitGroup sync.WaitGroup waitGroup.Add(len(functions)) defer waitGroup.Wait() for _, function := range functions { go func(f func()) { defer waitGroup.Done() f() }(function) } }</code>
この関数をコード スニペットに適用します:
<code class="go">func1 := func() { f(0) } func2 := func() { f(1) } func3 := func() { f(2) } Parallelize(func1, func2, func3)</code>
以上がGolang で真の並列処理を実現する方法: ゴルーチン、デッドロック、チャネル?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。