web-dev-qa-db-ja.com

akkaとfutures、ExecutionContextを使用する必要があります

以下 @ Tomasz Nurkiewiczによるこのブログ scalaフューチャーを実行するために、アッカアクターと対話するときに、ExecutionContextを選択するために4つの異なるアプローチが利用できることがわかります。

import ExecutionContext.Implicits.global

//or

implicit val ec = ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(50))

//or (inside actor)

import context.dispatcher

//or (explicitly)

val future = Future {
    //...
} (ec)

1つだけがakka固有であり、残りは並行性が他の場所でアクターによって処理されるという事実にとらわれません。

アクターおよび先物で同時並行性を処理することが避けられない状況があることを考えると(たとえば、 私の質問SOスリックについて )、どのパラダイムが最適ですか?アクターのディスパッチャーまたは他の可能性の1つで未来を実行します(上図参照)。


ところで、SOに関する私の質問を読み直すと、ScalaのグローバルExecutionContextを使用したことがわかりますが、ログには、ActorSystemのデフォルトディスパッチャーに属するものとして将来のコードを処理するスレッドが記録されます...それで何が起こっているのですか?


編集、

上記のSO=質問に戻り、例を再作成しました。次のログが表示されたため、世界はより意味をなしています。デフォルトのグローバルForkJoinPoolが、ディスパッチャーはアクターに使用されます):

[INFO] [11/04/2015 09:29:06.267] [wtf-akka.actor.default-dispatcher-3] [akka://wtf/user/$a] ['wtf1] external block pre future
[INFO] [11/04/2015 09:29:06.287] [wtf-akka.actor.default-dispatcher-3] [akka://wtf/user/$a] ['wtf1] external block post future
[INFO] [11/04/2015 09:29:06.287] [ForkJoinPool-2-worker-7] [akka://wtf/user/$a] ['wtf1] internal block pre sleep
[INFO] [11/04/2015 09:29:06.461] [wtf-akka.actor.default-dispatcher-2] [akka://wtf/user/$a] ['wtf2] external block pre future
[INFO] [11/04/2015 09:29:06.471] [wtf-akka.actor.default-dispatcher-2] [akka://wtf/user/$a] ['wtf2] external block post future
[INFO] [11/04/2015 09:29:06.472] [ForkJoinPool-2-worker-5] [akka://wtf/user/$a] ['wtf2] internal block pre sleep
7
Yaneeve

あなたはスリックを例として考えると言います。 SlickはJDBCを使用するため、ブロッキングI/Oを使用します。つまり、データベースからの応答を待機している間、スレッドは他の作業に使用できなくなります。そのためにデフォルトのAkkaディスパッチャーを使用したくありません。

データベース操作に対して個別の実行コンテキストを定義して、それを使用することができます。 http://doc.akka.io/docs/akka/snapshot/general/actor-systems.html#Blocking_Needs_Careful_Management が役立つと思います。

3
lutzh