6

TwitterFinagleを使用してサーバーエンドプログラムを作成しています。私は完全なTwitterサーバースタックを使用せず、非同期処理を可能にする部分(Future、Functionなど)のみを使用します。Futureオブジェクトにタイムアウトを設定したいので、次のように記述しました。

Future<String> future = Future.value(some_input).flatMap(time_consuming_function1);
future.get(Duration.apply(5, TimeUnit.SECONDS));

time_consuming_function15秒より長く実行されます。ただしfuture、5秒後にタイムアウトせず、time_consuming_function1終了するまで待機します。

これは、オペレーションチェーン全体ではなく、作成にかかるfuture.get(timeout)時間のみを考慮しているためだと思います。futureオペレーションチェーン全体をタイムアウトする方法はありますか?

4

1 に答える 1

2

基本的に、満たされた Future で map/flatMap を呼び出すと、コードはすぐに実行されます。

あなたの例では、 を呼び出すとすぐに未来を満たしているFuture.value(some_input)ので、 flatMap はすぐにコードを実行し、 への呼び出しgetは何も待つ必要はありません。また、すべてが 1 つのスレッドで行われます。より適切な使用法は次のようになります。

import scala.concurrent.ops._
import com.twitter.conversions.time._
import com.twitter.util.{Future,Promise}

val p = new Promise[String]
val longOp = (s: String) => { 
  val p = new Promise[String]
  spawn { Thread.sleep(5000); p.setValue("Received: " + s) }
  p 
}
val both = p flatMap longOp
both.get(1 second)  // p is not complete, so longOp hasn't been called yet, so this will fail
p.setValue("test")  // we set p, but we have to wait for longOp to complete
both.get(1 second)  // this fails because longOp isn't done
both.get(5 seconds)  // this will succeed
于 2013-02-05T17:18:21.883 に答える