2013-08-01 18 views
5

私は機能の一部としてHTTP要求を行うライブラリを構築しています。それを複数の環境で動作させるには、Futuresの有無にかかわらず作業できるように配備されます。Syncronous Scala別スレッドなしの将来

非同期HTTP実装を使用しているかどうかに応じて、タイプFutureのライブラリのインスタンス、またはタイプIdのインスタンスを作成できるように、ライブラリのパラメータ型をレスポンスの型に設定することをお勧めします。 (Idはアイデンティティモナドかもしれません - ユーザーに一貫したインターフェースを公開するには十分です)

私はこのアプローチから始めましたが、複雑になっています。私が本当に代わりにしたいのは、未来型のどこでも、将来のボクシングの同期応答を必要に応じて使用することです。しかし、Futuresを使用すると常にスレッドプールが発生することを理解しています。これは飛行しません。 AppEngine(必要な環境)。

現在のスレッドで実行される値から未来を作成し、スレッドを生成することができない環境で問題を引き起こさない方法はありますか?

(psの追加要件として、私はscala.concurrentで利用できる機能を制限可能性がありますバックのScala v2.9.1にライブラリを構築横断できるようにする必要があります)、私はあなたがしたい理解して何から

+1

'未来を作成する方法はありますか?現在のスレッドで実行する必要があります。 – Jatin

+0

私が説明したように、実装全体で一貫したリターンタイプを作成するには – adamnfish

+1

私はこの質問を理解することはできませんでした。あなたがすでにresultの最終的な価値を持っていて将来のラッパーが必要な場合は、 'Promise'を使うのはどうですか? – Jatin

答えて

3

を何かを実行し、結果をFutureでラップします。その場合、あなたは常に

val p = Promise[Int] 
p success 42 
val f = p.future 

Promiseは、したがって、あなたが今42

約束は非常によくhere説明されている最終的な値を含むfutureラッパーを持って使用することができます。

+0

ああ、もちろん、ありがとう!素晴らしいリンク。ここでの問題は、ExecutionContxt(暗黙的にまたは他の方法で)を提供する必要があることです。提供されたExecutionContextがこのPromiseアプローチで実際に使用されるかどうかはわかりませんが、いずれかの方法で、これはJavaでチェック例外のようになり、将来を消費するアプリケーションを通してコンテキストを含める必要があります。 – adamnfish

+3

また、Promiseオブジェクトには、これをより簡潔にするためのメソッドが含まれています: 'Promise.successful(42).future'。 – adamnfish

+0

@adamnfishいいえ、あなたは上記のビットコードのためにExecutionContextは必要ありません。私たちは将来何かを提出するつもりはありません。私はあなたがそれと間違っていると思う。 'import scala.concurrent._'だけで十分です。また、それが答えると答えた場合は答えを受け入れてください:) – Jatin

1

ScalazバージョンのFuture特性でlookとする。 forkまたはapplyが呼び出されない+すべてのExecutionContextのインポートを完全に取り除かない限り、現在のスレッドで実行されるTrampolineのメカニズムの上に基づいています)=

+0

非常に興味深いアプローチ、ありがとう。私はむしろscalazを含める必要はありません(特に、最新バージョンは2.9.1にクロスビルドされていないため)。しかし、ExecutionContextのインポートをやめてしまうと、ここで非常に便利になります。 – adamnfish