6

我正在使用 Twitter Finagle 编写一个服务器端程序。我不使用完整的 Twitter 服务器堆栈,只使用启用异步处理的部分(如 Future、Function 等)。我希望 Future 对象有超时,所以我写了这个:

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

time_consuming_function1运行超过 5 秒。但是future5 秒后没有超时,它一直等到time_consuming_function1完成。

我认为这是因为future.get(timeout)只关心future创建需要多长时间,而不是整个运营链。有没有办法让整个操作链超时?

4

1 回答 1

2

基本上,如果您在满意的 Future 上调用 map/flatMap,代码会立即执行。

在您的示例中,当您调用时,您会立即满足您的未来Future.value(some_input),因此 flatMap 会立即执行代码,并且调用get不需要等待任何东西。此外,一切都发生在一个线程中。更合适的用法是这样的:

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 回答