13

私は分散システムのコースを受講しており、Scala を使用してプロジェクトを作成する必要があります。インストラクターは、Scala は複数のコアを使用して計算を行い、アクター モデルと統合しながら並列処理を使用して問題を解決するという意味で優れていると教えてくれました。

これは理論的な問題です。私は Akka を使用してアクター モデルの基本をいくつか学びました。私の質問は、プログラミング中に、さまざまなアクターが複数のコアで動作するように、ユーザーがコンパイラに詳細を提供する必要があるのか​​、それとも Scala がそれを処理して複数のコアを使用するのかということです。さまざまなアクターのコア?

簡単に言えば、私の質問は次のとおりです。Scala で Akka ライブラリを使用して複数のアクターを宣言する場合、Scala コンパイラーはマルチコア CPU パワーを自動的に使用して、コア間でさまざまなアクターを分散しますか?それとも、プログラマーはこれを行うために何らかの入力を提供する必要がありますか?

4

2 に答える 2

23

TL;DR: Akka の既定の構成では、ほとんどのユース ケースで優れた並列処理を実現するために何もする必要はありません。

より長い回答: Akka のアクターは Dispatcher で実行され、そのDispatcher には、通常はスレッドのプールである ExecutionService があります。スレッドの数は開発者によって構成されますが、デフォルトではマシンの CPU コア数の 3 倍です (参照構成のdefault-dispatcher.parallelism-factor こちらを参照)。

どの時点でも、各 CPU コアはこれらのスレッドの 1 つを使用してアクタを実行できます。そのため、CPU のコア数と同じ数のスレッドが Dispatcher の ExecutionService にあれば、それを利用することができます。すべてのコアの。これがデフォルト構成のコア数の 3 倍に設定されている理由は、ブロッキング IO を補うためです。

IO は遅く、CPU を使用するのではなく IO を実行しているときに、ブロッキング呼び出しがスレッドを占有します。したがって、最適なレベルの並列処理を実現するための鍵は、このスレッド プールを構成することです。

  • ノンブロッキング IO のみを実行している場合は、使用している CPU コアの数に設定して、CPU を最大限に活用していると確信できます。
  • より多くのブロッキング IO を行うほど、より多くのスレッドが適切な並列処理を維持する必要がありますが、注意してください - より多くのスレッドを使用すると、より多くのメモリが使用され、スレッドは世界で最も軽量なものではありません。
于 2013-09-13T19:28:40.920 に答える