Future / Await和Async / Await有什么区别

时间:2018-04-23 08:25:20

标签: 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)
}
  

Javascript / Scala中的 Async / Await 有什么区别?

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

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

2 个答案:

答案 0 :(得分:2)

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

在高负载的系统中暂停线程可能很昂贵,因为线程上下文必须保存在内存中,并且它可能导致缓存未命中等。由于这个原因,阻塞线程在并发编程中被认为是不好的做法。 / p>

Javascript中的async / await语法是非阻塞的。当async函数调用" await"时,它将转换为Future,并放入执行队列。当awaited将来完成时,调用函数被标记为准备执行,并且稍后将恢复它。重要的区别是在这个模型中不需要暂停线程。

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

进一步阅读

答案 1 :(得分:1)

异步 非阻止时,

等待正在阻止。 Await在当前线程中等待完成任务,而async不会阻止当前线程并在后台运行。

我不了解JavaScript。在Scala中,来自scala.concurrent包的 Await 用于阻止主线程。还有一个名为 scala-async 的库,用于在 async 块中使用等待

如果您使用的是scala-async,则需要在async

中调用await