com.twitter.util.Await 没有引发 com.twitter.util.TimeoutException
com.twitter.util.Await doesn't raise a com.twitter.util.TimeoutException
我预计此代码会引发 TimeoutException,但它不会。我做错了什么?
import com.twitter.conversions.time._
import com.twitter.util.{Await, Future}
object Tmp {
def main(args: Array[String]): Unit = {
Await.result(
Future{
Thread.sleep(10000000)
},
1 second
)
}
}
Future.apply
方法的 scaladoc 有一条说明:
a
is executed in the calling thread and as such some care must be taken with blocking code.
所以一般来说你不应该用 Futures 执行阻塞操作。
如果你想阻止调用,你应该使用 com.twitter.util.FuturePool
。有关执行阻止调用的更多背景信息,请参阅 Twitter Util 文档的 Blocking or synchronous work 部分。
因此您的代码可能如下所示:
import com.twitter.conversions.time._
import com.twitter.util.{Await, FuturePool}
object Tmp {
def main(args: Array[String]): Unit = {
Await.result(
FuturePool.unboundedPool {
Thread.sleep(5000)
},
1 second
)
}
}
在这个例子中,我使用 unboundedPool
作为一个简单的例子。但是请检查 FuturePool documentation 以找到适合您的用例的 FuturePool
。
我预计此代码会引发 TimeoutException,但它不会。我做错了什么?
import com.twitter.conversions.time._
import com.twitter.util.{Await, Future}
object Tmp {
def main(args: Array[String]): Unit = {
Await.result(
Future{
Thread.sleep(10000000)
},
1 second
)
}
}
Future.apply
方法的 scaladoc 有一条说明:
a
is executed in the calling thread and as such some care must be taken with blocking code.
所以一般来说你不应该用 Futures 执行阻塞操作。
如果你想阻止调用,你应该使用 com.twitter.util.FuturePool
。有关执行阻止调用的更多背景信息,请参阅 Twitter Util 文档的 Blocking or synchronous work 部分。
因此您的代码可能如下所示:
import com.twitter.conversions.time._
import com.twitter.util.{Await, FuturePool}
object Tmp {
def main(args: Array[String]): Unit = {
Await.result(
FuturePool.unboundedPool {
Thread.sleep(5000)
},
1 second
)
}
}
在这个例子中,我使用 unboundedPool
作为一个简单的例子。但是请检查 FuturePool documentation 以找到适合您的用例的 FuturePool
。