scala - Future/Await 和 Async/Await 的区别是什么

标签 scala async-await future

在 Scala 和其他编程语言中,可以使用 Futures 和 Await。

(在实际代码中,会使用例如 zip+map 而不是 Await)

def b1() = Future { 1 }
def b2() = Future { 2 }

def a() = Future {
  Await.result(b1(),Duration.inf) + Await.result(b2(),Duration.inf)
}

What is the difference to Async/Await in Javascript/Scala?


async function b1() { return 1 }
async function b2() { return 3 }

async function a() { 
  return await b1() + await b2()
}

最佳答案

Scala 中的“Await.result”函数是“阻塞的”,这意味着调用线程将暂停,直到等待的 Future 完成,此时它将以返回值恢复。

在高负载的系统中,暂停线程可能会很昂贵,因为线程上下文必须保存在内存中,并且可能导致缓存未命中等。由于这个原因,在并发编程中阻塞线程被认为是不好的做法。
async / await Javascript 中的语法是非阻塞的。当 async函数调用“await”,转换为Future,放入执行队列。当awaited future 完成后,调用函数被标记为准备好执行,它将在稍后的某个时间点恢复。重要的区别是在此模型中不需要暂停任何线程。

有许多库实现了 async / await Scala 中的语法,包括 https://github.com/scala/scala-async

进一步阅读

  • Futures and Promises PRASAD、PATIL 和 MILLER 合着的书很好地介绍了阻塞和非阻塞操作。
  • 关于scala - Future/Await 和 Async/Await 的区别是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49976504/

    相关文章:

    scala - 类型投影有什么用?

    scala - 如何在Sbt中配置ivy的锁策略

    c# - 将 UI 线程的 TaskScheduler 存储在字段中是否安全?

    java - 终止并向 Executor 提交可调用对象

    scala - 描述 Slick 中的可选字段

    scala - 如何使用 foreachPartition 在 Spark 中为每个分区高效构建一个 ML 模型?

    javascript - Typescript async/await 与 Observable 或 Promise

    async-await - Blazor 客户端刷新组件

    scala - 如何在它们自己的执行上下文中而不是在 Actor 系统调度程序上运行 future。 [斯卡拉| Akka ]

    C# 相当于 Scala Promise