多线程与javascript承诺



只是学习承诺。Javascript是单线程的,对吗?那么,当它使用fetchapi发出http请求时,所有这些都发生在一个线程中?

那么它是如何管理PromisePool的并发性的呢?

var p = Promise(...)
p.then(
...//stuff1
)
p.then(
//stuff2
)

然后上面的两个不能在多个线程上运行,对吗?就在一个线程中?感谢

Javascript是单线程的,对吗?

否。这是一个常见的过度简化。

JavaScript运行一个主事件循环,一次只能做一件事。

通常,所有的JavaScript都会在一个事件循环上运行,所以一次只运行一段JS。

然而,许多JavaScript函数调用的代码不是JavaScript。以浏览器中的fetch为例。发出HTTP请求的责任由主事件循环之外的浏览器负责,因此当JS程序继续运行其他任务时,它可以发出多个请求并等待响应。

Web Workers(浏览器(和Worker Threads(Node.js(是将js代码移动到主事件循环之外的工具。

这些可以使用线程来实现。


我有一些代码,可以在文件系统中搜索音频文件,然后从中提取元数据。一旦收集到所有元数据,就会将其传递给进一步处理。

我当前的实现使用带有awaitfor循环,因此一次只处理一个文件以获取元数据。

我的第一次尝试是并行进行,试图同时读取数百个音频文件,耗尽了我系统上的所有RAM。

例如,我可以切换到Promise Pool,一次读取4个文件(每个CPU内核1个(,以获得两全其美。

Javascript是单线程的,对吗?

是的,一段JavaScript代码总是在一个代理中运行,一个代理一次只能执行一个函数。

所以当它使用fetchapi进行http请求时,所有这些都发生在一个线程中?

不,不是真的。虽然您的JavaScript代码不能与其他JavaScript代码并行运行,但浏览器可以并行执行其他事情(如渲染页面、垃圾收集…(,包括为您执行请求。一旦响应返回,结果就会通过解析promise返回到JavaScript中。

它是如何管理并发的?

虽然两个函数不能同时运行,但两个异步函数可以(或Promise链(,因为它们由多个执行单元组成,一旦其中一个完成,另一个可以接管:

(async function first() {
await undefined;
console.log(2);
await undefined;
console.log(4);
})();
(async function second() {
console.log(1);
await undefined;
console.log(3);
})();

因此,JavaScript确实有某种形式的并发,但在函数级别(或异步函数中的块(,而不是在单个指令级别。

为了获得真正的并行执行,您需要多个代理(WebWorkers、ServiceWorkers(,然后它们也可以以有限的方式共享内存。

最新更新