2012年9月6日木曜日

Scala Tips / Scala 2.10味見(7) - Future(5)

Futureクラスの機能を整理してみました。

基本機能

Futureを使う上で必須の基本機能として以下の5メソッドをピックアップしました。

  • onSuccess
  • onFailure
  • onComplete
  • isCompleted
  • value

残念ながら、Futureの完了待ち合わせの機能はメソッドとしては用意されておらず、Awaitオブジェクトを使う必要があります。

汎用コンビネータ

"いつもの"コンビネータです。Futureはモナドなので、Scalaのモナドとして綺麗に動くようなコンビネータ群が提供されています。

  • foreach
  • map
  • flatMap
  • filter
  • withFilter
  • collect
  • zip
  • andThen

エラー処理

Futureはエラー処理に関するメソッドが多数用意されています。基本機能の中でエラー処理にも分類できるものは併記してその旨を記述しています。

  • onFailure (基本機能)
  • onComplete (基本機能)
  • failed
  • transform
  • recover
  • recoverWith
  • fallbackTo

並列プログラミングの論点の一つは、非同期実行の結果発生したエラーをどのようにハンドリングするのか、という点です。

scala.parallel.Futureでは、問答無用に例外を送出する仕様になっていましたが、これでは事実上(1)アプリケーション全体をアボートさせる、(2)ログに残しておく処理などをした後、例外を無視する、といった大雑把な例外処理しかできません。

本格的な応用ではより精密なエラーハンドリングが必要になりますが、scala.concurrent.Futureはこのあたりのメカニズムが整備されています。

Scalaz 6 Promiseと比較しても、例外処理機能の充実はScala 2.10 Futureのアドバンテージといえます。

並列処理

並列処理を扱うメソッドとしては以下のものが当てはまります。

  • either
  • zip (汎用コンビネータ)
  • fallbackTo (エラー処理)

Futureの同期は、Futureの内部処理とAwaitオブジェクトが行うこともあり、ここに分類できるFutureのメソッドはそれほど多くありません。Futureクラスにあるのはコンビネータとして実現すると便利なものになります。

その他

以上のどれにも分類できないメソッドです。

  • mapTo

諸元

  • Scala 2.10.0-M7
  • Scalaz 6.0.4

0 件のコメント:

コメントを投稿