【问题标题】:What is the difference of Future/Await and Async/AwaitFuture/Await 和 Async/Await 有什么区别
【发布时间】:2018-04-23 16:54:34
【问题描述】:

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

【问题讨论】:

    标签: scala async-await future


    【解决方案1】:

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

    在高负载的系统中暂停线程可能代价高昂,因为线程上下文必须保存在内存中,并且可能导致缓存未命中等。因此,在并发编程中,阻塞线程被认为是一种不好的做法。

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

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

    进一步阅读

    • PRASAD、PATIL 和 MILLER 的 Futures and Promises 书中很好地介绍了阻塞和非阻塞操作。

    【讨论】:

    • 谢谢@Rich,Scala asyn/await 库的工作方式是否相同,但将 Futures 放入队列并恢复函数?如果我理解正确的话,asyn/await 正在阻止函数的执行,但不会通过阻止它来占用线程。 async/await 更像是 Go 中的 goroutine 还是绿色线程?
    • 避免阻塞的主要原因是死锁的危险;性能不是问题。
    • @Tim,我认为这不是真的。也许您正在考虑无锁争用解决算法意义上的“非阻塞”?我认为这与这里讨论的意义上的“非阻塞”完全不同。请参阅en.wikipedia.org/wiki/Non-blocking_algorithm 和“不要混淆”链接。我相信 async/await 代码与同步代码具有完全相同的死锁属性,假设您翻译了独占锁。无论如何,异步代码的动机与这个问题是相切的。对不起,如果我通过将它添加到我的答案中混淆了问题。
    • @StephanSchmidt,是的,Scala async/await 库的工作方式类似于 Javascript 中的 async/await。我想我知道您对“绿色线程”评论的看法,但是 Green v.s.本机线程实际上与 Futures 和 async/await 之间的编程语法区别正交。不过,这个评论框太小了,无法进行讨论 :-) 见 en.wikipedia.org/wiki/Green_threads
    • @Rich 感谢您的解释!
    【解决方案2】:

    Await 是阻塞的,而 async非阻塞。 await 在当前线程中等待完成任务,而 async 不会阻塞当前线程并在后台运行。

    我不知道 JavaScript。在 Scala 中,来自 scala.concurrent 包的 Await 用于阻塞主线程。还有一个名为 scala-async 的库,用于在 async 块中使用 await

    如果你使用的是 scala-async,那么你需要在 async 中调用 await

    【讨论】:

    • await b1() 应该是阻塞的,在异步函数 a() 运行的线程中,不是吗? Javascript 是否使用绿色线程,例如在节点这里?
    猜你喜欢
    • 2021-08-25
    • 2012-03-20
    • 2018-02-22
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2021-09-20
    • 2017-12-30
    相关资源
    最近更新 更多