Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 到非阻塞代码节点js的阻塞代码循环_Javascript_Node.js_Dom Events - Fatal编程技术网

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