javascript - 带有 javascript 承诺的多线程
问题描述
只是学习承诺。Javascript 是单线程的吧?那么当它使用 fetch api 发出 http 请求时,这一切都发生在一个线程中吗?
那么它是如何使用 PromisePool 来管理并发的呢?
var p = Promise(...)
p.then(
...//stuff1
)
p.then(
//stuff2
)
那么上面的两个不能在多个线程上运行,对吗?就在一个线程中?谢谢
解决方案
Javascript 是单线程的吧?
不,这是一种常见的过度简化。
JavaScript 运行一个主事件循环,它一次只能做一件事。
通常,您的所有 JavaScript 都将在一个事件循环上运行,因此一次只能运行一个 JS。
但是,许多 JavaScript 函数调用的代码不是 JavaScript。以fetch
浏览器为例。发出 HTTP 请求的责任由主事件循环之外的浏览器负责,因此它可以发出多个请求并等待响应,同时 JS 程序继续运行其他任务。
Web Worker(浏览器)和 Worker Threads (Node.js) 是让您将 JS 代码移到主事件循环之外的工具。
这些可以使用线程来实现。
我有一些代码可以在文件系统中搜索音频文件,然后从中提取元数据。收集完所有元数据后,会将其传递给进一步处理。
我当前的实现使用for
循环,await
因此一次只处理一个文件以获取元数据。
我的第一次尝试尝试并行执行它们,并尝试同时读取数百个音频文件,耗尽了我系统上的所有 RAM。
例如,我可以切换到 Promise Pool 并一次读取 4 个文件(每个 CPU 内核 1 个),以获得两全其美的效果。
推荐阅读
- c# - 添加到列表时如何生成新的对象名称
- kubernetes - 在 K8S 上安装 RabbitMQ 时绑定卷失败
- swift - 如何使用 Swift 将领域数据库备份到 iCloud?
- asp.net-core-webapi - .net core 3.1 api 中的 dbcontext 中的数据始终由 null 填充
- google-cloud-storage - 从网站直接上传到 Goolge Cloud Storage 存储桶
- javascript - 局部视图返回时,全局异常处理程序不重定向错误页面
- nearprotocol - 与接近原生 rust/assemblyscript 相比,使用接近 evm 可靠度合约的权衡是什么?
- html - 从本地 netbeans 中删除文件而不将其从服务器中删除
- angular - 如果我在父子中使用相同的表单控件,UI 不会更新
- elasticsearch - 在 ElasticSearch 中上传同义词文件