私は書く代わりに私を可能にする軽量のライブラリを探しています:
val future1 = process1()
future1.onSuccess { process2() }
以下:
val future1 = process1()
future1.await()
process2()
スレッドをブロックせずAwait.result(future1)
に(そうではありません:)つまり、後者を前者に変換する継続ベースのライブラリを想像しています。
私は書く代わりに私を可能にする軽量のライブラリを探しています:
val future1 = process1()
future1.onSuccess { process2() }
以下:
val future1 = process1()
future1.await()
process2()
スレッドをブロックせずAwait.result(future1)
に(そうではありません:)つまり、後者を前者に変換する継続ベースのライブラリを想像しています。
タカはAkkaDataflowConcurrencyを見てください。まさにあなたが望むもののように見えます!
例(ドキュメントを参照):
flow {
val f1 = flow { "Hello" }
val f2 = flow { "world!" }
f1() + " " + f2()
} onComplete println
Akka Dataflowは、ScalaのDelimited Continuationsを使用して、舞台裏で自動的に継続を生成します。
私が現在知っているそのようなライブラリはAkkaDataFlowだけです:http ://doc.akka.io/docs/akka/snapshot/scala/dataflow.html
プロジェクト定義(https://github.com/akka/akka/blob/master/project/AkkaBuild.scala)を見ると、akka-dataflowにはあまり依存関係がないように見えるので、かなり軽量であるはずです。
更新: akka-dataflowのドキュメントから抜粋した使用例を次に示します。
flow {
val f1 = flow { "Hello" }
val f2 = flow { "world!" }
f1() + " " + f2()
} onComplete println
これは、コードを手続き的な方法で記述できることを明確に示しています(ただし、内部ではこれは実際にはmap / flatMapチェーンに変換されます)。
もう1つの簡単な代替手段として、継続に使用することを検討しましたか?これらは使用するのが少し冗長ですが、一般的な利点は同じです。明示的なcpsスタイルでコードを乱雑にするのではなく、手続き的にコードを記述します。たとえば、上記の例は、次の純粋なscalaコードに直接変換されます。
{for {
f1 <- future( "Hello" );
f2 <- future( "world!" )
} yield f1 + " " + f2
} onComplete println
それほど違いはありません。また、ライブラリがない場合よりも軽量なライブラリは見つかりません(ただし、簡潔さの観点からはakka-dataflowを好むことは認めますが、わずかな差があります)。
この質問は1年前に行われました。現在、Akka Dataflowよりも有望な代替手段はscala-asyncであり、https://github.com/scala/asyncで入手できます。
Akka Dataflowは、アクティブに保守されておらず、非推奨への道を進んでいる継続プラグインに依存しています。
一方、scala-asyncは汎用のcpsソリューションではなく、非同期コードの記述にのみ取り組んでいます(これは、cpsプラグインの最も一般的なユースケースであると私は信じています)。言い換えれば、それはflow
(マクロの助けを借りて)Akkaのメソッドと同等のものを直接実装し、そのため、cpsプラグインよりも狭い(そしてより適切に定義された)スコープを持ちます。
これは、readmeページから抜粋した例です。
val future = async {
val f1 = async { ...; true }
val f2 = async { ...; 42 }
if (await(f1)) await(f2) else 0
}
Scalaにはもう1つのデータフロー同時実行実装があり、チェックアウトする必要があるかもしれません。ScalaFLowです。githubリポジトリには、作業を非常に詳細に説明した論文PDFも含まれています。
Kaiはこのフォーラムスレッドでデモを行います:
引用:
「最小限のデモ(はい、先物のように見えます):
val v = new Variable[Int]
flow { println( v() ) // suspends without blocking }
flow { v := 42 // resumes above flow }
「」