web-dev-qa-db-ja.com

Akkaアクターシステムが終了するのを待つ方法は?

Akka(2.0)アクターシステムを起動し、いくつかのメッセージを送信して、それが重労働を行うのを待つ必要があります。その後、私はそれらの俳優とは関係のない何かをする必要があります。

私はすべてのアクターが次のコードで停止するのを待とうとしました:

val system = new ActorSystem("parallelRunners")
val master = system.actorOf(Props[Master])
master ! Start
system.awaitTermination // <-- hangs here

すべてのアクターはself ! PoisonPillを介して自殺します。私は何が間違っているのですか?

16
Rogach

Akka 2.4.1 for scala 2.11では、再び異なるように見えます。

system.awaitTermination()は非推奨であり、ドキュメントでは代わりにAwait.result(system.whenTerminated, timeout)を使用するように指示されています。

2 が言ったように、_system.terminate_はまだシステムを終了する方法です。

これが私が使用したいくつかのサンプルコードです:

_val actorSystem = ActorSystem("ActorSystem")
val myActors = actorSystem.actorOf(Props[MyActor].withRouter(RoundRobinPool(10)), "MyActors")
rainbows.foreach(Rainbow => myActors ! Rainbow)
Await.ready(actorSystem.whenTerminated, Duration(1, TimeUnit.MINUTES))
_

次に、MyActorクラスにcontext.system.terminate()という行があります。

24
Michael Larsen

Akka 2.4以降では、system.awaitTermination()を使用する必要があります。これにより、待機できる_Future[Terminated]_が返されます。

システムを終了するには、終了時にアクター内から_ActorSystem.terminate_を使用する必要があります(例:context.system.terminate()

出典: リリースノート

6
203

タイトルについてこの質問に遭遇した人への補足:どうやら、Akka 2.5は_actorSystem.awaitTermination_をサポートしなくなったようです。理由は、通話のブロックを回避するというAkkaの哲学である可能性があります。代わりに、actorSystem.registerOnTermination(...)は、ActorSystemがシャットダウンされている間にアクションを実行するための非ブロッキング方法として使用できます。

それでも、_ActorSystem.whenTerminated_が提供するFutureを介して、アクターシステムが完了するのを待つことができます。

_val system = new ActorSystem("parallelRunners")
val master = system.actorOf(Props[Master])
master ! Start

import scala.concurrent.Await
import scala.concurrent.duration._
Await.ready(system.whenTerminated, 365.days)
_
5
Sebastian Kruse

私は解決策を見つけました-マスターアクターからsystem.shutdownを呼び出すだけです:

context.system.shutdown
5
Rogach

system.shutdownを使用して、メインスレッドからActorSystemを強制終了することもできます。ただし、その操作は非同期です。メインスレッドが完了するまでブロックする必要がある場合にのみ、system.awaitTerminationを使用する必要があります。 parallelRunnersがプログラムの残りの部分に役立つものを返す場合は、プログラムをブロックせずに続行するのがおそらく最も簡単です。

4
Ben Schmidt

どうですか:

import scala.concurrent.Await
import scala.concurrent.duration._

Await.ready(system.terminate(), 5.seconds)

終了は未来を返します:

def terminate(): Future[Terminated]

そして、あなたはこの未来の完成を待つことができます。

0
Osskar Werrewka

akka 2.3.9では、アクターシステムをシャットダウンし、シャットダウンするのを待つことは2段階のプロセスのようです。

  1. シャットダウンを開始します:actorSystem.shutdown
  2. ブロッキング方式で終了を待ちます:actorSystem.awaitTermination

手順(2)の代わりに、おそらく(これらの選択肢をテストしていない)、代わりにisTerminatedでポーリングするか、終了時にコードを実行するためにregisterOnTerminationを使用することができます。したがって、akka.actor.ActorSystemのコメントを調べて、実装にこれらのメソッドを理解して選択することをお勧めします。

おそらく、Futureの戻り値の方が良かったので、API(?)に関する他のオプションがありません。

0
matanster