16

これらの Future 関連のクラスと Scala のトレイトの関係は何ですか? また、それらが異なるパッケージに散らばっているのはなぜですか?

私はそれらを見つけました:

abstract class scala.actors.Future
object         scala.actors.Futures
trait/object   scala.collection.parallel.FutureThreadPoolTasks
trait          scala.concurrent.FutureTaskRunner
trait          scala.parallel.Future    (the package consists of only this file...)

それらは大きく異なるものですか、それとも統合できない別の理由がありますか?

どちらか一方をいつ使用するかを示す良い例はありますか?

編集:各クラス/特性/オブジェクトの機能と、それらの存在を正当化する方法/それらがどのように役立つかを説明するための報奨金。

4

2 に答える 2

11

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つのメソッドしかありませapplyisDone。私の推測ではisDone、と同様にscala.actors.Future.isSet、値が計算されているかどうかを確認するための非ブロッキング呼び出しであると想定されており、このapplyメソッドを使用して実際に値を取得する必要があります。

于 2011-06-15T01:04:29.030 に答える
4

以下、簡単な説明です。(パーツは scala doc からコピーされます)。わからないことがあれば教えてください。より具体的に具体例を挙げて説明します。

抽象クラス scala.actors.Future -- java.util.concorrent.Futureに精通していますか? scala.actors.Futureは基本的に非同期計算の結果を表しますが、 actor場合です。

scala.actors.Futures -- scala.actors.Futureを処理するための 4 つのユーティリティ メソッドを含むオブジェクト (~singleton) 。

scala.parallel.Future -- (これは私にとって初めてのことでしたが、非常に基本的な操作 (apply と isDone) が含まれています) 関数に関連付けられた並列計算が完了していない場合に呼び出し元をブロックするパラメーターのない関数です。(関数? ヒント: extends () )

scala.collection.parallel.FutureThreadPoolTask​​s -- scala doc から: 「Java スレッド プーリング API に基づくタスク オブジェクトの実装と、future を使用した同期。」それで十分?:)

scala.concurrent.FutureTaskRunner - Executorに精通していますか? ExecutorSchedulerは、scala 標準ライブラリの具象実装 (3 つのうちの 1 つ) です。executeFromActorは、より興味深いメソッドの 1 つであり、これをいつ使用する必要があるかについてのヒントを提供するはずです。

于 2011-06-12T13:15:46.793 に答える