Javascript 当事情本来就可以并行运行时,工人的意义何在?

Javascript 当事情本来就可以并行运行时,工人的意义何在?,javascript,node.js,Javascript,Node.js,考虑到以下两种方法: async function test1() { for(let i = 0; i < 10000; i++){ let p = new Promise((resolve)=> { setTimeout(()=>{ console.log("Thread 1 ", i); resolve(); }, 5000, i);

考虑到以下两种方法:

async function test1() {
    for(let i = 0; i < 10000; i++){
        let p = new Promise((resolve)=> {
            setTimeout(()=>{
                console.log("Thread 1 ", i);
                resolve();
            }, 5000, i);
        });
        await p;
    }
}
async function test2() {
    for(let i = 0; i < 10000; i++){
        let p = new Promise((resolve)=> {
            setTimeout(()=>{
                console.log("Thread 2 ", i);
                resolve();
            }, 1000, i);
        });
        await p;
    }
}
const promise1 = new Promise((resolve)=> {
    test1();
    resolve();
})
const promise2 = new Promise((resolve)=> {
    test2();
    resolve();
})

这实际上意味着不需要手动线程来处理Nodejs中的并行性。然而,我见过有人使用Worker来实现多线程,我不能真正理解这背后的意义,尽管我在发布这个问题之前已经在Google和YouTube上做过

在javascript中可以做的基本上是在一个线程中进行协作多任务处理。但是,有些限制适用:

这只是合作式的多任务处理。 它只是单线程的。 所以,虽然你可以做等待承诺。所有[foo,bar]执行可能从foo切换到bar的唯一点,另一种方式是等待。所以有了这个代码:

async function foo() {
  doFirst();
  doSecond();
  await doThird();
}
bar中的代码只能在函数运行之前、等待期间和函数完成之后运行。它永远不会在DoFirst和DoSecond之间运行

接下来,所有线程都在一个线程中运行。这个线程一次只能做一件事。因此,使用非对等代码将保存整个JS线程:

function busyWait(ms) {
    const target = ms + (new Date()).getTime();
    while(true) {
      if((new Date()).getTime() > target) {
        return;
      }
    }
}

这将在运行时阻止所有其他代码。但是,将只使用一个CPU内核。

您的代码没有任何作用。试着让这两个函数都忙一段时间,结果会有所不同。@tkausl,是的,这段代码除了长时间运行的任务外,没有做任何特殊的事情。如果我不是简单的等待,而是从一个大数据库中查询一些东西,会有什么不同吗?这会阻碍第二种测试方法吗?真正的工作者的观点是,你实际上可以同时使用多个内核,并进行操作系统线程调度…@ASDFGerte,假设你即将编写一个用于处理并发连接的套接字,在这种情况下,工作进程是否有意义?setTimeout不是一个长时间运行的任务。这是一个漫长的无所事事的过程。
function busyWait(ms) {
    const target = ms + (new Date()).getTime();
    while(true) {
      if((new Date()).getTime() > target) {
        return;
      }
    }
}