作者:莎ss侄莎 | 来源:互联网 | 2023-10-13 12:24
有人可以解释我为什么 Twitter 未来的行为不是 Async?有这个代码
private val future: Future[String] = Future {
Thread.sleep(2000)
println(s"Running this effect in ${Thread.currentThread().getName}")
"Hello from Twitter"
}
println("Present")
Await.result(future)
两秒后的输出是这个
Running this effect in main
Present
所以未来是阻塞的,而不是在另一个线程中运行
回答
Twitter 期货与 Scala 中的“标准”期货在语义上有些不同。
Future.apply
实际上类似于标准Scala的Future.successful
:它会创建一个Future
是已经满足了-所以,你通过在块立即执行。
使用 Twitter Futures,您不需要在ExecutionContext
任何地方隐式拖拽的烦人。相反,您有一个FuturePool
显式地将代码传递给它以异步执行。例如:
val pool = FuturePool.unboundedPool
val future: Future[String] = pool {
Thread.sleep(2000)
println(s"Running this effect in ${Thread.currentThread().getName}")
"Hello from Twitter"
}
这样做的好处是,与 不同scala.concurrent
,这Future
是独立的:它“知道”管理它的池,因此,您无需随身携带它Future
,以防万一有人需要做map
或flatMap
或某些其他转换就可以了。