Promise.all 同时或并行运行 [重复]

Posted

技术标签:

【中文标题】Promise.all 同时或并行运行 [重复]【英文标题】:Promise.all is run concurrently or in parallel [duplicate] 【发布时间】:2021-09-10 07:31:20 【问题描述】:

据我所知,NodeJS 不会并行运行 Promise,而是并发运行它们,因为它是单线程事件循环架构。通过创建新的子进程以利用多核 CPU 来并行运行事物的能力。但是当我运行这个测试时,它显示了并行运行的结果。请帮我解释一下

const a = new Promise(resolve => setTimeout(() => resolve("a"), 2000))
const b = new Promise(resolve => setTimeout(() => resolve("b"), 2000))
const c = new Promise(resolve => setTimeout(() => resolve("c"), 2000))
const begin = Date.now();
async function test() 

  const promises = [a, b, c];
  const [output1, output2, output3] = await Promise.all(promises);
  return `parallel is done: $output1 $output2 $output3`;


test().then((arr)=>
    console.log(arr);
    console.log( "time :", Date.now()- begin);
)
// parallel is done: a b c
//time : 2010

【问题讨论】:

这能回答你的问题吗? Is Node.js native Promise.all processing in parallel or sequentially? "当我运行这个测试时,它会显示并行运行的结果。" - 我看不出您的测试如何区分并发超时和并行超时?跨度> 我认为如果它同时运行它将是6s 不,这是顺序的。 “并发”的字面意思是它们“同时”发生。 Promise.all 根本不“运行”承诺。它只是监视一组承诺的完成情况。是的,promise 可以并行运行。这几乎就是异步的全部意义所在。 【参考方案1】:

它不是并行运行的,但我相信你的问题正是这个视频的重点:https://www.youtube.com/watch?v=mvWSD-5G4Yw

【讨论】:

【参考方案2】:

仅仅因为它的单线程并不意味着它只能做一件事。

是的,你可以生成,但大多数事情都是这样完成的:

"hey, ur done?"
"nope"
goes ask whatever needs to be done next while waiting

它基本上是一个很大的while true,它会到处检查东西直到事情完成。

【讨论】:

以上是关于Promise.all 同时或并行运行 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何判断我的 promise.all 是不是并行运行?

Promise.all() 允许失败的替代方案? [复制]

并行承诺的自定义错误处理

Promise.all 每次处理一组 6 个 Promise [重复]

如何使用Promise.All()执行异步诺言?

并行解决承诺