Javascript 到非阻塞代码节点js的阻塞代码循环
我有一个简单的循环。我只是想找出我写代码的不同方式,这样我就可以把阻塞代码变成无阻塞代码Javascript 到非阻塞代码节点js的阻塞代码循环,javascript,node.js,dom-events,Javascript,Node.js,Dom Events,我有一个简单的循环。我只是想找出我写代码的不同方式,这样我就可以把阻塞代码变成无阻塞代码 function jsSum(){ let a = 3.14, b = 4.16; for(i = 0; i < 10000000000; i++){ a += b; } let total = a; return total; } 函数jsSum(){ 设a=3.14,b=4.16; 对于(i=0;i
function jsSum(){
let a = 3.14, b = 4.16;
for(i = 0; i < 10000000000; i++){
a += b;
}
let total = a;
return total;
}
函数jsSum(){
设a=3.14,b=4.16;
对于(i=0;i<1000000000;i++){
a+=b;
}
设total=a;
返回总数;
}
有什么方法可以让它运行得更快一点或者在事件循环中吗?在主事件循环中只有一个线程可以使用,因此,如果长时间的CPU密集型任务在该线程中运行,它们就无法不阻塞。节点允许各种方式的产卵和繁殖。这里有一种方法可以获取循环并将其放入新线程
const { Worker, isMainThread, parentPort, workerData} = require('worker_threads');
if (isMainThread) {
function doAsyncThing(n) {
return new Promise(resolve => {
const worker = new Worker(__filename, {workerData: {n}});
worker.on('message', resolve);
});
};
// run two loops in parallel:
doAsyncThing(1)
.then(res => console.log("got response from thread1:", res))
doAsyncThing(2)
.then(res => console.log("got response from thread2:", res))
} else {
const {n} = workerData;
let res = jsSum(n)
parentPort.postMessage(res);
}
function jsSum(n){
console.log("jsSume started for call ", n)
let a = 0;
for(let i = 0; i < 100; i++){
console.log(`worker ${n} in loop ${i}`)
a += 1;
}
let total = a;
return total;
}
调用
doAsyncThing()
之后,您的主线程就可以进行响应请求等其他操作了。另外,(fwiw)console.log()
不是演示这一点的好工具,因为。您真正想解决的问题是什么?代码没有明确的目标,因此我们无法提出更有效的方法来创建输出。它是阻塞代码(不涉及异步操作),因此在运行时会阻塞事件循环。让这样的东西不阻塞事件循环的唯一方法是在一个进程中运行它,在另一个进程中运行它,或者在本机代码中编写它,您可以使用本机线程并使其异步。
worker 1 in loop 1
worker 1 in loop 2
worker 1 in loop 3
worker 1 in loop 4
worker 2 in loop 1
worker 2 in loop 2
worker 1 in loop 5