并行运行两个循环的Javascript

并行运行两个循环的Javascript,javascript,node.js,parallel-processing,Javascript,Node.js,Parallel Processing,我不熟悉javascript和node.js 这里有两个循环,我想让它们并行运行 function loop1(){ for (var i = 10000; i < 20000; i++) { console.log(i); } } function loop2(){ for (var i = 0; i < 10000; i++) { console.log(i); } } loop1(); loop2(); 但这是一

我不熟悉javascript和node.js

这里有两个循环,我想让它们并行运行

function loop1(){
    for (var i = 10000; i < 20000; i++) {
        console.log(i);
    }
}
function loop2(){
    for (var i = 0; i < 10000; i++) {
        console.log(i);
    }
}
loop1();
loop2();
但这是一种输出

10000
10001
...
19999
0
1
...
9999
我尝试过使用像这样的承诺

Promise.all([loop1(), loop2()])
但什么也没发生

对此有什么想法吗?我的最终目标是将文件夹中的文件分为两半,并并行处理它们。
因此,多线程或多处理可能是可以接受的。感谢您的帮助。

对于并行工作,您可以在浏览器的javascript和node.js中使用

此外,您可以使用,但它不会执行,它只会告诉javascript运行后者:

函数loop1(){
for(设i=100;i<200;i++){
setTimeout(()=>console.log(i));
}
}
函数loop2(){
for(设i=0;i<100;i++){
setTimeout(()=>console.log(i));
}
}
loop1();

loop2()只有异步函数*运行异步**(没有工作线程)

异步函数loop1(){
对于(变量i=10000;i<20000;i++){
等待控制台日志(i);
}
}
异步函数loop2(){
对于(变量i=0;i<10000;i++){
等待控制台日志(i);
}
}
loop1();
loop2()非常好的问题

JS是单线程的,这意味着它不能并行运行。对于像JS这样的异步语言来说,按顺序运行所有内容可能会很奇怪,但基本上就是这样

然而,JS通过事件循环将工作分为任务和微任务,从而提供了并行工作的假象。关于事件循环有很多要说的,我建议Jake Archibald在这个主题上进行编译,但是基本上你的函数
loop1
是同步的,不会被分割成任务,因此它会在做任何其他事情之前运行完成

您将无法让
loop1
loop2
并行运行,但您可以将它们拆分为微任务,以便它们像

t=0 loop1's microtask 1
t=1 loop2's microtask 1
t=2 loop1's microtask 2
t=3 loop2's microtask 2
...
实现这一点的一个简单方法是在每次迭代时等待。这将创建一个异步承诺,该承诺将尽快解决,同时将控制流返回给其他等待的任务或微任务

这就是为什么会运行
loop1
然后运行
loop2

const loop1=()=>{
for(设i=0;i<5;i++){
控制台日志(i);
}
}
常量loop2=()=>{
for(设i=5;i<10;i++){
控制台日志(i);
}
}
loop1();
loop2()
使用
promises.all()并行运行

函数loop1(){
返回新承诺((解决、拒绝)=>{
对于(变量i=10000;i<20000;i++){
log('loop1=>',i);
}
解决();
})
}
函数loop2(){
返回新承诺((解决、拒绝)=>{
对于(变量i=0;i<10000;i++){
log('loop2=>',i);
}
解决();
});
}
所有([loop1(),loop2()]);
使用
async.parallel()


这是否回答了您的问题?如果使用
console.log(i),您将获得所需的结果;控制台日志(i-10000)相反,但我认为这在这里没有帮助。我也不确定您希望通过同时处理多个文件获得什么,即使JavaScript适合这样做。我阅读了这篇文章,并尝试使用Promise.all([loop1(),loop2()),但它没有像我预期的那样工作。它只是分别运行两个循环。您应该使用
let
使代码正常工作。我认为辅助线程可能是解决此问题的另一种选择。让我看一下文件。谢谢。我想这就是我想要的。我也会试试网络工作者。谢谢你的解释!
t=0 loop1's microtask 1
t=1 loop2's microtask 1
t=2 loop1's microtask 2
t=3 loop2's microtask 2
...
function loop1(){
      return new  Promise((resolve, reject) =>{
        for (var i = 10000; i < 20000; i++) {
          console.log('loop1 =>', i);
        }
        resolve();
      })
    }
    
    function loop2(){
      return new Promise((resolve, reject) =>{
      for (var i = 0; i < 10000; i++) {
        console.log('loop2 =>', i);
      }
     
      resolve();
    });
    }
    
    Promise.all([loop1(), loop2()]);