2

Scalaで次のアクターの例を作成しました:http://pastebin.com/pa3WVpKy 行で発生するスロットルなし(SendMoneyメッセージの数を減らす):

val processed = iterations - counter.getCount/2
if (processed < i - banksCount * 5) Thread.sleep(1)

このテストでのメッセージ処理は非常に低速です(特に銀行関係者が少ない場合)。

これは、アクターのメールボックスがSendMoneyメッセージでいっぱいであり、ReadAccountResponseメッセージの受信に長い時間がかかるためです(通常、アクターのメールボックスはほぼメールボックスの最後にあり、メールボックス全体をスキャンする必要があります)。このような場合にメールボックスのスキャン時間を改善するにはどうすればよいですか?たぶん、いくつかのメッセージを高優先度として定義する可能性がありますか?通常のメッセージ用と優先度の高いメッセージ用の2​​つのメールボックスがあると便利です。優先度の高いメールボックスを最初にスキャンできます。また、「返信」メソッドは、優先度の高いメールボックスにメッセージを自動的に送信する可能性があります。または、通常のメッセージと応答用に2つのメールボックスを作成しますか?あなたの意見は何ですか?

よろしくWojciechDurczyński

4

2 に答える 2

2

この問題に対する潜在的に優れた解決策の1つは、Phillip Hallerの半透明関数です。この関数では、scalaコンパイラーが、一致式が一致できるオブジェクトの種類に関する情報を反射的に公開します。次に、アクターのメールボックスにメッセージクラスでインデックスを付けることができ、特にこの種の「干し草の山の中の針」のシナリオでは、ルックアップが大幅に高速化される可能性があります。

ご覧のとおり、 TransluncentFunctionのAPIは非常に簡単です。Translucentプロジェクトはしばらく休止しているようですが、すぐに再開されることを願っています。

于 2010-11-02T18:22:05.547 に答える
0

Liftのアクターには、まさにこの優先順位付けが組み込まれていると思います。単一の「act」メソッドをオーバーライドするのではなく、アクションの優先順位に応じて実装できるさまざまなメソッド(正確な名前は不明)がいくつかあります。

これでスキャン速度の低下の問題が解決するかどうかはわかりませんが

于 2010-11-02T21:34:22.933 に答える