scala.actors._
abstract class Future
まず、ドキュメントの内容を見てみましょう。
タイプTの値を再取得する、アリティ0の関数。これを適用すると、将来の値が使用可能になるまで現在のアクター(Actor.self)をブロックします。
そして、それは基本的にすべてです。別のアクターの外部のどこからでもアクターと通信していて(sender
参照を使用して、別のメッセージでメッセージへの非同期応答を受信できる)、送信されたメッセージへの応答が必要な場合は、次の2つの選択肢があります。
- アクターが結果の計算を完了するまで待機するブロッキングメッセージを送信します
- Futureを返すメソッドを使用してメッセージを送信し、問題の値が本当に必要な場合にのみそのFutureをブロックします(それまでにすでに計算されている可能性があります)
したがって、Futureは、まだ存在していないが、おそらく近い将来に存在する値のプレースホールです。以下も興味深いです:
["isSet"を使用して]ブロックせずに、その値がすでに使用可能かどうかを確認するために、futureを照会できます。
これにより、必要な値が計算/フェッチされるまで、必要なことを実行でき、値が使用可能になったかどうかを定期的に確認できます。
Scalaライブラリのソースコードを少し掘り下げてみると、Futuresは実際には単なるアクターであることがわかりました。Future
それ自体は、abstract class
によって拡張されたprivate class FutureActor
です。この最後のクラスは、実際に-機能を実装するクラスですFuture
。
object Futures
これは、渡されたブロックを非同期的に評価し、結果を表すfutureを返す便利なファクトリメソッドである「futuresを操作するメソッド」object Futures
の単なるコンテナであるため、それほど興味深いものではありません。小さな例はこれです:future
import scala.actors.Futures
val f = Futures.future {
println("Start: inside block")
val s = System.currentTimeMillis
while(System.currentTimeMillis < (s + 1000)) {
// Simulate computation
}
println("Start: end of block")
42
}
println("After future")
println(f())
println("The end")
これは次のような結果になるはずです
Start: inside block
After future
Start: end of block
42
The end
これは、future
実際にfutureの値を取得しようとするまで、-callが次のコードをブロックしないことを示しています(出力は非決定論的であることに注意してください。After future
出力の先頭にも表示される可能性があります)。
scala.collection.parallel
このパッケージはScala2.9.xの新機能であり、お気に入りのコレクションのいくつかに対応する並列パッケージを実装しています。これらはすべて:で始まりPar
ます
- ParIterable
- パーセク
- ParSet
- ParMap
すでに知っているか推測しているかもしれませんが、これらのコレクションは、心配することなく、すべての可能な操作を並行して実装します。小さなデモンストレーション:
(1 to 10).par.map { b => print(b + " "); b * b }
3 1 6 2 7 4 5 9 10 8
# => (1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
結果は常に同じですが、要素が処理される順序も非決定的です。また、マルチコアシステムを使用している場合は、大規模なコレクションのパフォーマンスが大幅に向上する可能性があります。
trait FutureThreadPoolTasks
FutureThreadPoolTasks
特性は特性を拡張するのでTasks
、最初にそれを見てみましょう。特性の上のコメントは言う:
並列コレクションで使用されるタスク実行機能を宣言するトレイト。
他のソースコメントとトレイトで見つかったメソッドから判断するとTasks
、タスクは計算する必要のある作業の単位を表します。問題がさらに分割可能かどうかに応じて、利用可能なリソースがさらにある場合、タスクは、より多くのタスクを作成することによってタスクをさらに分割できます。
現在、FutureThreadPoolTasks
トレイト自体はタスクを計算するための単なる方法でありjava.util.concurrent.Future
、同期にクラスを使用します。つまり、!を使用しません。scala.actors.Future
ソースから:
JavaスレッドプールAPIとfuturesを使用した同期に基づくタスクオブジェクトの実装。
object FutureThreadPoolTasks
繰り返しになりますが、それほど壮観ではありませんFutureThreadPoolTasks
。トレイトが使用するいくつかの(実際には3つだけの)ユーティリティメソッドを含むコンパニオンオブジェクトです。
scala.concurrent
これらのクラスのドキュメントは本当に悪く、明らかに、これらのクラスの使用法を示す例はほとんどありません(私は1つも見つかりませんでした)。私は間違いなくこれらについてより多くの情報を収集し、できるだけ早くこのセクションを拡張しようとします!
scala.parallel
trait Future
scala.parallel
パッケージにはこの特性のみが含まれているため、これは「進行中の作業」のようです。私の知る限り、これはをFuture
使用しない実装に関連することになりますActors
が、それは単なる推測です。特性の署名は次のとおりです
trait Future[@specialized +R] extends (() => R)
@specializedアノテーションまたは分散(一般的なRタイプの前の+)について説明するつもりはありませんが、この特性の基本的な考え方は、Futureは、実行されると値を返す関数であるということです(そのため、まだ計算されていない場合はブロックします)。
また、トレイト自体の中には2つのメソッドしかありませapply
んisDone
。私の推測ではisDone
、と同様にscala.actors.Future.isSet
、値が計算されているかどうかを確認するための非ブロッキング呼び出しであると想定されており、このapply
メソッドを使用して実際に値を取得する必要があります。