推特未来封锁
Twitter Future blocking
有人可以解释为什么 Twitter 未来的行为不是异步的吗?
有这个代码
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
或其他一些转换。
有人可以解释为什么 Twitter 未来的行为不是异步的吗? 有这个代码
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
或其他一些转换。