首页 > 解决方案 > 带有 javascript 承诺的多线程

问题描述

只是学习承诺。Javascript 是单线程的吧?那么当它使用 fetch api 发出 http 请求时,这一切都发生在一个线程中吗?

那么它是如何使用 PromisePool 来管理并发的呢?

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

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

标签: javascriptpromise

解决方案


Javascript 是单线程的吧?

不,这是一种常见的过度简化。

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

通常,您的所有 JavaScript 都将在一个事件循环上运行,因此一次只能运行一个 JS。

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

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

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


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

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

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

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


推荐阅读