NodeJS CPU密集型的多线程VS CPU密集型的承诺?在引擎盖下,它们会是一样的吗?

yeotifhr  于 2023-02-08  发布在  Node.js
关注(0)|答案(1)|浏览(147)

假设我们在NodeJ中有一个CPU密集型代码:

for (var i = 0; i < 1e10; i++){}

我听说nodejs使用线程池来处理异步代码,所以我的问题是:将这份工作转化为承诺,如:

const p = new Promise((resolve, reject) => {
    for (var i = 0; i < 1e9; i++){
        if (i == 1000) resolve("ok");
    }
}).then(result => { 
    console.log('res ' + result)
})

并且创建一个新的工作线程来处理这个CPU密集型的工作,一旦nodej已经在引擎盖下这样做了呢?另外,如果它们在引擎盖下是相同的,为什么人们会认为如果没有一种方法阻塞事件循环,使用工作线程来处理CPU密集型的工作会更好呢?
关于nodeJs事件循环、Nodejs中的异步与多线程的问题。

u5i3ibmn

u5i3ibmn1#

Promise执行器函数是同步调用的,所以这两种情况都是同步运行for循环。
虽然第二个版本(Promise)在循环迭代1000次后调用resolve(),但在整个for循环完成之前,它仍然无法调用.then()处理程序,因为Promise就是这样工作的,它们等待控制返回到事件循环,然后才能调用.then().catch()处理程序。
你所展示的代码中没有涉及线程池,它只是运行你的Javascript的主线程。

**承诺只是一个通知系统。**它们不会让同步运行的东西神奇地异步运行。它们有时可以用来改变某个东西运行的时间(稍后运行),但当它运行时,它仍然像它没有被 Package 在承诺中时一样运行。

要使某个东西真正异步运行(这样它就不会阻塞主线程),您必须使用实际的异步操作重写它,或者必须将同步代码放入一个workerThread中以防止它阻塞主线程。

相关问题