/ / Akka Future内でラップされたコードをブロックすることで、Futureによってサポートされているスレッドもブロックされます。この場合、将来的にどのように役立つのでしょうか? - scala、akka、future

Akka Futureの内部にラップされたコードをブロックすることで、Futureによってバックアップされたスレッドもブロックされます。この場合、将来的にどのように役立つのでしょうか? - scala、akka、future

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を使用します。