推特未来封锁

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,以防有人需要对其进行 mapflatMap 或其他一些转换。