在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()
}
答案 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