web-dev-qa-db-ja.com

JavaスレッドはScala / Akkaアクターと比較して重い)?

scalaアクターとJavaスレッドのパフォーマンスを比較したところです。

違いを見て驚いたのですが、自分のシステムでは最大2000スレッド(一度にライブ)しか生成できなかったことがわかりましたが、同じシステムで最大500,000のscalaアクターを生成できました。

どちらのプログラムも、JVMの約81MBのヒープメモリを使用していました。

Javaスレッドはscala/akkaの俳優よりもはるかに重い重量ですか?)説明できますか?scala-actorをこれほど軽量にした主な要因は何ですか?

最高のスケーラビリティを実現したい場合は、Java JBossやTomcatのような従来のWeb /アプリケーションサーバーに基づいていますか?

ありがとう。

48
SmartSolution

Scalaアクター(Akkaの種類を含む)はJava=スレッドを使用します。魔法はありません。同時に実行されている数千以上のスレッドがほとんどのデスクトップマシンで問題になります。

アクターモデルは、必要な作業がない限りスレッドを占有しないオンデマンドのアクターを可能にします。いくつかの問題は、いくつかの作業を取得するために待機している多くの睡眠エージェントが効果的にモデル化できます。その場合、特にパフォーマンスが優先されているAkkaのようなライブラリがある場合、アクターはJavaスレッドを使用して作業を完了するための非常に効率的な方法です。

Akka docs 基本をかなりよく説明しています。

合理的にスケーラブルなすべてのWebサーバーは、この種の問題を何らかの方法で解決する必要があります。おそらく、主にアクターが内部で使用されるかどうかに基づいてWebサーバーを決定するべきではありません。使用するものに関係なく、いつでも自分でアクターを追加できます。

39
Rex Kerr

Akkaアクターはスレッドに相当しません。スレッドプールで実行されるCallableに似ています。

メッセージがアクターにディスパッチされると、そのアクターはスレッドプールに配置されてメッセージを処理します。完了すると、プールされたスレッドを使用して他のアクターを実行できます。

18
parsifal