2012-05-02 10 views
3

(1台のマシン上で)長時間実行する計算を同時に実行したい場合は、Akkaのアクターが役立ちます。Akka:メールボックスを埋める対俳優の産卵

1つのアプローチは、各作業ごとに新しいアクタをスポーンすることです。何かのように

while(true) { 
    val actor = system.actorOf(Props[ProcessingActor]) 
    (actor ? msg).map { 
     ... 
     system.stop(actor) 
    } 
} 

2番目のアイデアは、ルータの背後にある設定された数のアクターを設定することです。すべてのメッセージをルータに送信します。

システムがオーバーロードされている(受信したメッセージの速度が処理速度よりも高い)方が良いでしょうか?

どれが長く続きますか?そして、どちらも最終的にOOMErrorでシステムを爆破するだろうか?

答えて

4

各タスクに新しいActorを作成する前に、Futureを使用することもできます。それは本当にあなたが達成したいことにかかっています。メモリー使用量を最小限に抑えて多くの作業を行うには、アクター/ルーターのアプローチを使用する必要があります。各タスクはFuturePromiseの新しいインスタンスを作成するので、先物はより高価です。しかし、それはあなたのユースケースに大きく依存します。私は本当にそれらの必要がないときに多くの俳優を作成しません。特にsystem.actorOfは常に新しいエラーカーネルを作成します。

+0

合意 - この種のユースケースには先物が優れています。 – sourcedelica

+2

@ericacm私は同意しません。同じように多くの作業を行い、何らかのエラー処理(例えば、再起動の失敗)が必要であることがわかっている場合。次に、作業を処理するために設定された数のアクタを定義することは、はるかに信頼性の高いようです。次に、アクターは、メッセージ内で行うべき作業を受け取り、それを処理し、応答を送信します。アクタがクラッシュした場合(何らかの理由で)、スーパーバイザが再起動し、再試行を指示します。先物を使って、これはやりにくいと確信しています(確かに不可能ではありませんが、より困難です)。しかし、私はそれがユースケースに依存していると思います。明確にするために –

+0

Thx。俳優がメッセージよりも高価であることを意味する。 – rompetroll

関連する問題