将异步代码视为Node.js中的线程?

时间:2016-11-19 16:12:17

标签: node.js multithreading promise

有点奇怪的问题,想象一下你需要运行10个SYNCRONOUS函数,它们完成后无关紧要,你只想知道完成所有10个函数的时间:I.E。

f1()
f2()
f3()
...
f10()
doStuffWithResult();

现在,如果您使用这样的承诺,假设您已将每个承诺重写为promoises:

Promise.All([f1,f2,f3,f4,f5,f6,f7,f8,f9,f10])
.then(() => {
   doStuffWithResult();
})

您会看到性能提升吗?从理论上讲,我想说不,因为这些函数仍然是同步的,并且所有内容仍在一个线程上运行。

谢谢!

1 个答案:

答案 0 :(得分:3)

  

你会看到性能提升吗?

不,你提出的建议不会更快。

Promises不会创建线程。他们所做的只是提供一个合作系统,用于跟踪异步操作何时完成,然后通知感兴趣的各方成功或失败。它们还提供了在嵌套异步操作时传播错误的服务。

而且,您提出的Promise.all()代码甚至不起作用。您必须将一个promise数组传递给Promise.all(),而不是函数引用数组。在您的示例中,甚至不会调用您的函数。

并且,如果您将代码更改为实际执行的代码,那么它可能比直接调用同步函数更慢,因为您将执行promise代码并且所有.then()处理程序都在未来执行勾选(不同步)。

在node.js中,并行执行同步事物的唯一方法是启动子进程(可以并行执行)或将操作传递给可以使用实际操作系统线程的一些本机代码。