Akka / Scala Futureの背後にある哲学は、これまでにIOコール、ネットワークコールなどのブロックされたコードを見つけたときは、将来的にはそれをまとめて、ある時点後に非同期で結果を得る必要があります。しかし、以前にメインスレッドをブロックしていたコードのブロック部分は、Futureがバックアップされている別のスレッドでブロックされています。 Akka / Scala Futureが私たちを買収したのは何ですか?
val blockingCallResult: Result = block() //blocks the thread of execution.
now let"s use Akka/Scala future and wrap the blocking call with Future
val future = Future[Result] {
val blockingCallResult: Result = block() //also blocks on some thread in thread pool
blockingCallResult
}
将来をどのように活用して恩恵を受けるのですか?
回答:
回答№1は4単一の実行コンテキストしか持たない場合、およびブロッキングコードを実行する先物のみを使用し、一度に1つしか使用しないと、未来を使用することは実際には利点がありません。先物の利点は次のとおりです。
- 並列性 - マルチコアマシンでは、いくつかスレッドは同時に実行できます。実行コンテキストで先物を使用すると、すべてのアクションに対して新しいスレッドを作成するか、スレッドを手動で再利用するオーバーヘッドが回避され、実行コンテキストによってプールサイズを制御できます。
- I / Oと計算スレッドの分離異なる実行コンテキスト。これにより、カーネルは長時間実行される計算タスクに先立ってI / Oに対する対話的な応答をスケジュールし、待ち時間を改善することができます。
- 真の非同期I / O。 scala-redis-nb(またはNettyまたはReactiveMongo(?))。未来はむしろブロックするスレッドではなく、Futures(例えばPromises経由)を使って非同期API(コールバックを使用するかもしれない種類)を公開することができます。そしてスレッドを持たない真に非同期のコードを書くことができますI / Oでブロックされ、コールバックベースのAPIを直接使用するよりはるかに優れたAPIを使用します。