gpt4 book ai didi

java - Twitter Future 超时不适用于整个 flatMap 链

转载 作者:搜寻专家 更新时间:2023-11-01 00:51:22 24 4
gpt4 key购买 nike

我正在使用 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 秒。但是 future 不会在 5 秒后超时,它会一直等到 time_consuming_function1 完成。

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

最佳答案

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

在您的示例中,当您调用 Future.value(some_input) 时,您会立即满足您的 future ,因此 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

关于java - Twitter Future 超时不适用于整个 flatMap 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14710753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com