scala - 推特 future 封锁

有人可以解释为什么 Twitter future 的行为不是异步的吗? 有了这个代码

  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

所以future是阻塞的而不是运行在另一个Thread中

最佳答案

Twitter future 与 scala 中的“标准” future 在语义上有所不同。

Future.apply实际上类似于标准 scala 的 Future.successful : 它创建了一个 Future 已经满足 - 所以,您传入的 block 将立即执行。

使用 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或对其进行一些其他转换。

https://stackoverflow.com/questions/67983362/

相关文章:

javascript - console.log 在我的输入字段中给出 undefined

numpy - XGBoost:检查失败:有效:输入数据包含 `inf` 或 `nan`

xml - 同时迭代两个 for-each 循环

Flutter - 墨水池 : Why does onHover() require onTap()

flutter - 检查 flutter 中的连接并根据连接状态更改状态

kubernetes - 如何在 Kubernetes cronjob 中执行脚本 shell

c++ - std::sort 中用 lambda 函数指定的比较函数是否返回 bool 类型?

ruby - 如何在 ruby​​ 中编写一个采用散列样式、方括号参数的方法,例如 mymethod

awk - 使用 awk 和 gsub 用字符串替换 CSV 的列

python - Django Channels - Websocket 连接失败