19

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

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

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

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

4

7 に答える 7

28

Scala2.11用のAkka2.4.1では、これもまた異なるように見えます。

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

203が言ったように、それ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()

于 2016-02-02T18:40:13.187 に答える
7

Akka 2.4以降では、待機可能system.awaitTermination()なを返すを使用する必要がありますFuture[Terminated]

システムを終了するには、ActorSystem.terminate(たとえばcontext.system.terminate()、終了時にアクター内から)を使用する必要があります。

出典:リリースノート

于 2015-11-23T17:11:58.030 に答える
6

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

Futureそれでも、以下によって提供される方法で、アクターシステムが完了するのを待つことができますActorSystem.whenTerminated

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)
于 2017-06-16T14:00:31.340 に答える
4

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

context.system.shutdown
于 2012-09-15T10:36:42.853 に答える
4

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

于 2013-11-22T15:56:26.863 に答える
0

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

  1. シャットダウンを開始します。 actorSystem.shutdown
  2. ブロックして終了するのを待ちます。 actorSystem.awaitTermination

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

Futureおそらく、戻り値がもっと良かったかもしれないので、API(?)に関する他のオプションが欠けています。

于 2016-08-13T11:23:23.323 に答える
0

どうですか:

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

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

終了は未来を返します:

def terminate(): Future[Terminated]

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

于 2017-06-29T14:08:26.273 に答える