私は、scalaz Futures がどのように機能するかを完全には理解していないと思います。あるプロジェクトをscala futuresからscalazの実装に移植しようとしているのですが、問題はscalaz Futureの方がパフォーマンスが低いことです。最も単純な例は、Spray を使用した認証要求でプロファイルをロードすることです。
関数自体:
def loadProfile[A: CollectionProvider: JsonFormat](id: String) = future {
remote.findOne[A]("id" :> id) match {
case Some(profile) ⇒ \/-(profile)
case None ⇒ -\/(ProfileNotFoundRejection(id))
}
}
scalaz のバージョンは 1 つのシンボルだけが異なりFuture.apply
ますscalaz.concurrent
。そして今、いくつかのhtmlページをロードするSprayルート:
get {
path("profile" / "id" ~ Segment) { id ⇒
onSuccess(loadProfile[User](id)) {
case \/-(profile) ⇒ complete(html.page(profile))
case -\/(pnfr) ⇒ reject(pnfr)
}
}
}
と同様にloadProfile
、scalaz のバージョンはメソッド呼び出しのみが異なります。
get {
path("profile" / "id" ~ Segment) { id ⇒
ctx => loadProfile[User](id).runAsync {
case \/-(profile) ⇒ ctx.complete(html.page(profile))
case -\/(pnfr) ⇒ ctx.reject(pnfr)
}
}
}
しかし、scala Future バージョンのリクエストは (約) 143msで完了しますが、scalaz バージョンは260msで完了します。だから私はこの特定の要求についてはあまり心配していませんが、非同期実行と一般的なサービスのスケーラビリティについては、scalaz Future で理解しているように、実行を別のスレッドに手動でフォークする必要があるため、順次実行されますか? scalaz Future の使用法についての良いイントロ/チュートリアルはありますか?