【问题标题】:Javascript Running two loops in parallelJavascript并行运行两个循环
【发布时间】:2020-12-15 10:24:41
【问题描述】:

我是 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
0
10001
1
...
19999
9999

但这输出

10000
10001
...
19999
0
1
...
9999

我尝试过使用类似的承诺

Promise.all([loop1(), loop2()])

但什么也没发生。

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

【问题讨论】:

  • 这能回答你的问题吗? Can javascript run multiple functions at once?
  • 如果你改用console.log(i); console.log(i - 10000);,你会得到想要的结果,但我认为这在这里没有帮助。我也不确定您希望通过同时处理多个文件获得什么,即使 JavaScript 适合这样做。
  • 我阅读了这篇文章并尝试使用 Promise.all([loop1(), loop2()]),但它没有按预期工作。它只是分别运行两个循环。

标签: javascript node.js parallel-processing


【解决方案1】:

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

另外,你可以使用setTimeout,但它不会执行in really parallel,只会告诉javascript运行后者:

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

loop1();
loop2();

【讨论】:

  • 您应该使用let 使您的代码正常工作。
  • 我认为工作线程可能是我解决此问题的另一种选择。让我阅读文档。谢谢。
【解决方案2】:

很好的问题。

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

然而,

JS 通过事件循环将工作拆分为任务和微任务,提供了并行工作的错觉。关于事件循环有很多话要说,我会推荐 Jake Archibald 的 this talk 关于这个主题,但基本上你的函数 loop1 是同步的,不会被拆分为任务,因此它会在执行之前完成还有什么。

您将无法让 loop1loop2 并行运行,但您可以将它们拆分为微任务,以便它们像这样执行

t=0 loop1's microtask 1
t=1 loop2's microtask 1
t=2 loop1's microtask 2
t=3 loop2's microtask 2
...

实现此目的的一种简单方法是在每次迭代时发送await。这将创建一个尽快解决的异步承诺,同时将控制流交还给其他正在等待的任务或微任务。

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

const loop1 = () => {
  for (let i = 0; i < 5; i++) {
    console.log(i);
  }
}
const loop2 = () => {
  for (let i = 5; i < 10; i++) {
    console.log(i);
  }
}
loop1();
loop2();

但这会“并行”运行 loop1loop2

const loop1 = async () => {
  for (let i = 0; i < 5; i++) {
    console.log(i);
    
    // defer the remaining work to another microtask
    // gives back control to awaiting microtasks, like loop2's remaining work
    await null;
  }
}
const loop2 = async () => {
  for (let i = 5; i < 10; i++) {
    console.log(i);
    
    // defer the remaining work to another microtask
    // gives back control to awaiting microtasks, like loop1's remaining work
    await null;
  }
}
loop1();
loop2();

【讨论】:

    【解决方案3】:

    只有异步函数*运行异步**(没有工人)

    async function loop1(){
        for (var i = 10000; i < 20000; i++) {
            await console.log(i);
        }
    }
    async function loop2(){
        for (var i = 0; i < 10000; i++) {
            await console.log(i);
        }
    }
    loop1();
    loop2();

    *async 函数:包括那些在内部使用 event/timer/promise 和(可选)返回 Promise

    ** 里面有await

    【讨论】:

      【解决方案4】:

      使用promises.all()并行运行

      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()]);
      

      【讨论】:

        【解决方案5】:
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 2019-12-29
        • 1970-01-01
        • 1970-01-01
        • 2014-11-10
        相关资源
        最近更新 更多