【发布时间】:2020-11-19 00:45:48
【问题描述】:
是用async和await粗人的线程吗?
很多个月前,我学会了如何在 Android 上编写多线程 Java 代码。我记得我必须创建线程、启动线程等。
现在我正在学习 Javascript,我刚刚了解了 async 和 await。
例如:
async function isThisLikeTwoThreads() {
const a = slowFunction();
const b = fastFunction();
console.log(await a, await b);
}
这看起来比我以前做的简单得多,而且更直观。
slowFunction() 将首先启动,然后 fastFunction() 将启动,console.log() 将等到两个函数在记录之前解决 - 并且 slowFunction() 和 fastFunction() 可能同时运行。我希望它们最终在浏览器上,无论这些线程是否是单独的线程。但它看起来像粗略的多线程一样走路和说话。是吗?
【问题讨论】:
-
Javascript 是单线程语言
-
不是,不是。
async和await基本上只是语法糖,用于构建基于生成器的机制来管理 Promise 实例。 -
如果
slowFunction()和fastFunction()是异步函数,则假定它们被挂起,等待信号重新进入事件循环。它们不是在单独线程中运行的受 CPU 限制的函数。 -
@Pointy - 在进行函数调用时,您不必
await。例如,在上面的 OP 代码中,如果slowFunction和fastFunction都启动异步进程,则上面的代码会同时启动并允许它们并行运行,然后等待它们都完成后再执行console.log。如果 OP 使用了const a = await longFunction(); const b = await slowFunction();,它们将一个接一个地完成;fastFunction在slowFunction完成之前不会开始其进程。我肯定在真实代码中做到了这一点(不仅仅是Promise.all:-))。 -
@T.J.Crowder 好吧,我猜是的,它可以是任何表达式,并且当表达式计算为 Promise 时,它的行为“类似于 Promise”。我不能在我的环境中使用
async/await,所以我尽量保持简单。
标签: javascript multithreading asynchronous