3

長時間実行される計算を (1 台のマシンで) 同時に実行したい場合は、Akka アクターが役に立ちます。

1 つのアプローチは、作品ごとに新しいアクターを生成することです。何かのようなもの

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

2 番目のアイデアは、ルーターの背後に一定数のアクターを構成することです。そして、すべてのメッセージをルーターに送信します。

val router = system.actorOf(Props[ProcessingActor].withRouter(RoundRobinRouter(nrOfInstances = 5)))
while(true) {
    (router ? msg).map { ... }
}

システムが過負荷になっている場合 (受信メッセージのレートが処理レートよりも高い場合)、どちらが優れているのでしょうか?

どちらが長持ちしますか? そして、どちらも最終的に OOMError でシステムを爆破するのでしょうか?

4

1 に答える 1

4

Actorタスクごとに新しい を作成する前に、 を使用することもできますFuture。それは本当にあなたが達成したいことに依存します。最小のメモリ使用量で多くの作業を完了するには、アクター/ルーター アプローチを使用する必要があります。Futurefor each task はandの新しいインスタンスを作成するため、先物はより高価ですPromise。しかし、それは実際にはユースケースに依存し、どちらのアプローチが優れているかです。本当に必要がない場合は、たくさんのアクターを作成しません。特に、system.actorOfいつものように、新しいエラー カーネルを作成します。

于 2012-05-02T13:18:47.163 に答える