実行コンテキストはどのように
import scala.concurrent.ExecutionContext.Implicits.global
playの実行コンテキストとは異なります。
import play.core.Execution.Implicits.{internalContext, defaultContext}
彼らは非常に異なっています。
Play 2.3.x以前では、play.core.Execution.Implicits.internalContext
は、サイズに一定の制約があるForkJoinPool
であり、Playによって内部的に使用されます。アプリケーションコードには決して使用しないでください。ドキュメントから:
Playの内部スレッドプール-これは、Playによって内部的に使用されます。このスレッドプール内のスレッドによってアプリケーションコードが実行されたり、このスレッドプール内でブロッキングが実行されたりしてはなりません。そのサイズは、application.confのinternal-threadpool-sizeを設定することで構成でき、デフォルトでは使用可能なプロセッサーの数になります。
代わりに、ActorSystem
を使用するplay.api.libs.concurrent.Execution.Implicits.defaultContext
を使用します。
2.4.xでは、どちらも同じActorSystem
を使用します。これは、Akkaが独自のスレッドのプール間で作業を分散することを意味しますが、(構成以外の)ユーザーには見えません。複数のAkkaアクターが同じスレッドを共有できます。
scala.concurrent.ExecutionContext.Implicits.global
は、Scala標準ライブラリで定義されているExecutionContext
です。これは、ForkJoinPool
メソッドを使用してブロックコードを処理し、プールに新しいスレッドを生成する特別なblocking
です。 Playはそれを制御できないため、実際にはPlayアプリケーションでこれを使用しないでください。また、スレッドを大量に生成する可能性があります。注意しない場合は、大量のメモリを使用してください。
scala.concurrent.ExecutionContext.Implicits.global
についての詳細は this answer で記述しました。
それらは同じであり、Play、Akka、または組み合わせたアプリケーションの基になるアクターシステムのデフォルトディスパッチャーを指します。
play.api.libs.concurrent.Execution.Implicits.defaultContext
play.core.Execution.Implicits.internalContext
class ClassA @Inject()(config: Configuration)
(implicit ec: ExecutionContext) {
...
}
しかし、これは異なるです。
scala.concurrent.ExecutionContext.Implicits.global
また、DBドライバー(例:スリックを使用する場合、独自の実行コンテキストが考えられる場合があります。とにかく、
scala.concurrent.ExecutionContext.Implicits.global
を使用しないでください。プレイ中またはakkaフレームワークでは、この方法で、高負荷時に最適よりも多くのスレッドを使用して、パフォーマンスが低下する可能性があります。scala.concurrent.ExecutionContext.Implicits.global
を使用します。安全ですから心配しないでください。Await
将来のためにapplication.conf
で新しいディスパッチャーを定義する素晴らしい方法があります