nodeJS Async vs Sync

时间:2016-09-10 15:49:46

标签: javascript node.js express

在nodeJS中,一般的做法和建议是使用异步方法并对下一个函数进行回调。

我使用expressJS设置了一个nodeJS用于测试目的,我编写了 sync async 方法。无论使用异步还是同步方法,这两种方法都能正常回答所有请求,而且没有任何可察觉的延迟。

虽然我在项目中使用了异步方法,但我读到的鼓励使用异步方法的文章并没有解释为什么深入。 同步方法会避免使用callback hell

所以我很好奇,为什么不使用 sync 方法,因为它们都有效?它会通过使用一个或另一个来影响响应时间/性能吗?

3 个答案:

答案 0 :(得分:5)

节点在单个线程上运行。如果您正在处理大量连接,那么肯定会有比CPU绑定任务更多的IO绑定任务。例如,DB调用。 在等待数据库查询结果时,您可以接收更多请求或执行其他作业。

当您需要执行受CPU限制的操作时,问题就开始了:可能需要很长时间的任务。您需要拆分任务,将其中的一小部分拆分,然后将其余部分安排到以后的时间直到完成,或者您可以将其委托给另一个服务器/进程,无论如何。

如果您决定同步,服务器在执行该作业时将不再处理任何请求。是的,你将避免回调地狱,但无论多长时间,从开始到结束都要做一件事。如果你试图处理很多连接,这将不会很好。

麻烦的一个很好的例子是for循环:

for (let x of ['some', 'huge', 'array']) {
  // Do something heavy here, until it's not finished, server won't do
  // anything more than this heavy task
}

在“做某事”时,服务器应用程序不会处理任何其他传入请求。当然,当你有更重的任务和大量的请求时,问题会很严重。

在严重的节点服务器中,您不需要同步循环,除非由于X动机,它比异步解决方案表现更好。因此,你可以使用setTimeout,setImmediate,process.nextTick,Promises等异步。并且,你可能采用的第一种方法是继续传递方式,这意味着传递回调以在工作完成后执行,并且可能你会遇到回调地狱墙。

这是你与Promises或发电机或两者兼顾的那一刻: https://davidwalsh.name/async-generators

这样,你将避免回调地狱,并获得更好的代码(主观)。你也许想要关注异步/等待:https://github.com/tc39/ecmascript-asyncawait

您没有任何明显的优势,因为您是唯一提出请求的用户。用数千个连接进行测试。

Abrazo。

答案 1 :(得分:0)

嗯...

您可以将食物放入微波炉,同时洗澡,当您完成洗澡后,您可以(可能)将食物从微波炉中取出并食用。如果食物尚未准备好,你可以做其他事情直到它准备好了。那是异步的方式。

或者,您可以将食物放入微波炉中,盯着微波炉直至完成,吃完食物,然后洗澡。这是同步方式。

答案 2 :(得分:-1)

考虑下面的代码:

/now

首先调用 http://127.0.0.1/wait 然后 http://127.0.0.1/now

productid立即得到解答。一个线程不会相互干扰。

首先调用 http://127.0.0.1/wait 然后 http://127.0.0.1/wait

第二个电话在第一个电话接听之前无法接听。一个线程相互干扰。