假设我们在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中的异步与多线程的问题。
1条答案
按热度按时间u5i3ibmn1#
Promise执行器函数是同步调用的,所以这两种情况都是同步运行
for
循环。虽然第二个版本(Promise)在循环迭代1000次后调用
resolve()
,但在整个for
循环完成之前,它仍然无法调用.then()
处理程序,因为Promise就是这样工作的,它们等待控制返回到事件循环,然后才能调用.then()
或.catch()
处理程序。你所展示的代码中没有涉及线程池,它只是运行你的Javascript的主线程。
**承诺只是一个通知系统。**它们不会让同步运行的东西神奇地异步运行。它们有时可以用来改变某个东西运行的时间(稍后运行),但当它运行时,它仍然像它没有被 Package 在承诺中时一样运行。
要使某个东西真正异步运行(这样它就不会阻塞主线程),您必须使用实际的异步操作重写它,或者必须将同步代码放入一个workerThread中以防止它阻塞主线程。