javascript - Javascript async 和 await 是否等同于多线程?

标签 javascript multithreading asynchronous

正在使用 asyncawait粗人的线?
很多个月前,我学会了如何在 Android 上编写多线程 Java 代码。我记得我必须创建线程、启动线程等。
现在我正在学习 Javascript,我刚刚了解了 asyncawait .
例如:

async function isThisLikeTwoThreads() {
 const a = slowFunction();
 const b = fastFunction();
 console.log(await a, await b);
}
这看起来比我以前做的简单得多,而且更直观。slowFunction()将首先开始,然后 fastFunction()将开始,console.log()将等到两个函数都解决后再记录 - 和 slowFunction()fastFunction()可能同时运行。我希望它们最终在浏览器上,无论这些线程是否是单独的线程。但它看起来像粗略的多线程一样走路和说话。是吗?

最佳答案

Is using async and await the crude person's threads?


一点都不。它只是语法糖(非常非常有用的糖)而不是使用 promise ,而这又只是使用回调的一种(非常非常有用的)形式化方式。它很有用,因为您可以异步等待(不阻塞 JavaScript 主线程)本质上是异步的(如 HTTP 请求)。
如果需要使用线程,请使用 web workers , Node.js worker threads ,或您的环境提供的任何多线程。根据规范(现在),一次只允许一个线程在给定的 JavaScript“领域”内工作(非常松散:您的代码运行的全局环境及其关联对象等),因此只有一个线程一次可以访问该领域内的变量等,但线程可以通过消息传递(包括在它们之间传输对象而不复制)和shared memory进行合作.

For example:

async function isThisLikeTwoThreads() {
 const a = slowFunction();
 const b = fastFunction();
 console.log(await a, await b);
}

以下是该代码在 isThisLikeTwoThreads 时的作用叫做:
  • slowFunction被称为 同步并将其返回值赋给a .
  • fastFunction被称为 同步并将其返回值赋给b .
  • isThisLikeTwoThreads达到await a , 它包裹 a在一个 promise 中(就像你做了 Promise.resolve(a) )并返回一个新的 promise (不是同一个)。让我们将 promise 称为 aaPromise ”和函数“functionPromise ”返回的 promise 。
  • 后来,当aPromise解决,如果被拒绝 functionPromise以相同的拒绝原因被拒绝,并跳过以下步骤;如果满足,则下一步完成
  • isThisLikeTwoThreads中的代码继续包装b在一个 promise ( bPromise )中等待它解决
  • bPromise解决,如果被拒绝 functionPromise以相同的拒绝理由被拒绝;如果满足,isThisLikeTwoThreads 中的代码继续记录 aPromise 的履行值和 bPromise然后履行functionPromise值为 undefined

  • 上述所有工作都是在调用 isThisLikeTwoThreads 的 JavaScript 线程上完成的。已经完成,但它分布在多个“作业”中(JavaScript 术语;HTML 规范称它们为“任务”并指定 a fair bit of detail 以了解它们在浏览器上的处理方式)。如果 slowFunctionfastFunction启动一个异步进程并为此返回一个 promise ,该异步进程(例如,浏览器执行的 HTTP 调用)可能在 JavaScript 线程正在执行其他操作或(如果它也是 JavaScript 代码)的同时继续与 JavaScript 线程并行在主线程上)可能已经竞争了 JavaScript 线程上的其他工作(通过将作业添加到作业队列并在循环中处理它们的线程来竞争)。
    但是使用 Promise 不会增加线程。 :-)

    关于javascript - Javascript async 和 await 是否等同于多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63153400/

    相关文章:

    linux - 如何在 linux 的 openmpi 中启用多线程标志?

    node.js - 使用两个不同异步函数的结果

    javascript - 在文本字段左侧设置错误 Div 定位 - Jquery 验证引擎

    c++ - malloc/new 锁和多线程

    objective-c - 多线程 Objective-C 访问器 : GCD vs locks

    javascript - 如何从异步调用返回响应?

    java - 按顺序处理异步事件和发布结果

    javascript - 首先显示,然后通过 jQuery 隐藏

    javascript - Angular 页面到 Node.js 服务器套接字连接

    javascript - Angular.js 中的嵌套 View 模板?