gpt4 book ai didi

javascript - Javascript 异步函数和 Web worker 之间的区别?

转载 作者:可可西里 更新时间:2023-11-01 01:16:31 27 4
gpt4 key购买 nike

在线程方面,web worker 和声明为

的函数有什么区别
async function xxx()
{
}

?

我知道网络 worker 是在不同的线程上执行的,但是异步函数呢?这些函数的线程化方式是否与通过 setInterval 执行的函数相同,或者它们是否受制于另一种不同类型的线程化?

最佳答案

async 函数只是语法糖Promises 和它们是回调的包装器。

// v await is just syntactic sugar
// v Promises are just wrappers
// v functions taking callbacks are actually the source for the asynchronous behavior
await new Promise(resolve => setTimeout(resolve));

现在可以通过代码立即回调回调,例如如果你 .filter 一个数组,或者引擎可以在某个地方内部存储回调。然后,当特定事件 发生时,它会执行回调。可以说这些是异步回调,而那些通常是我们包装到 Promise 中并等待它们的回调。

为了确保两个回调不会同时运行(这会使并发修改成为可能,这会导致很多麻烦)每当事件发生时,事件不会立即得到处理,而是 Job (带参数的回调)被放入作业队列。每当 JavaScript Agent (= thread²) 完成当前作业的执行,它会在该队列中查找下一个要处理的作业¹。

因此,可以说异步函数只是一种表达连续作业的方式。

 async function getPage() {
// the first job starts fetching the webpage
const response = await fetch("https://stackoverflow.com"); // callback gets registered under the hood somewhere, somewhen an event gets triggered
// the second job starts parsing the content
const result = await response.json(); // again, callback and event under the hood
// the third job logs the result
console.log(result);
}

// the same series of jobs can also be found here:
fetch("https://stackoverflow.com") // first job
.then(response => response.json()) // second job / callback
.then(result => console.log(result)); // third job / callback

虽然两个作业不能在一个代理(= 线程)上并行运行,但一个异步函数的作业可能会在另一个作业之间运行。因此,两个异步函数可以运行 concurrently .

现在谁产生这些异步事件?这取决于您在 async 函数中等待的内容(或者更确切地说:您注册的回调)。如果它是一个定时器(setTimeout),一个内部定时器被设置并且 JS 线程继续其他作业直到定时器完成,然后它执行传递的回调。其中一些,尤其是在 Node.js 环境中(fetchfs.readFile)将在内部启动另一个线程。当线程完成时(通过事件),您只需交出一些参数并接收结果。

要获得真正的并行性,即同时运行两个作业,需要多个代理。 WebWorkers 就是代理。因此,WebWorker 中的代码独立运行(拥有自己的作业队列和执行器)。

代理可以通过事件相互通信,您可以通过回调对这些事件使用react。当然,如果将回调包装到 Promises 中,您也可以 await 操作:

const workerDone = new Promise(res => window.onmessage = res);

(async function(){
const result = await workerDone;
//...
})();

长话短说:

JS  <---> callbacks / promises <--> internal Thread / Webworker

¹ 还为这种行为创造了其他术语,例如事件循环/队列 等。 Job 一词由 ECMA262 指定。

² 引擎如何实现代理由引擎决定,但由于一个代理一次只能执行一个作业,因此每个代理有一个线程非常有意义。

关于javascript - Javascript 异步函数和 Web worker 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49092985/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com