在nodeJS中,通常的做法和建议是使用异​​步方法并回调下一个函数。
我出于测试目的使用expressJS设置了一个nodeJS,并编写了 sync 异​​步方法。无论使用异​​步还是同步方法,这两种方法都可以使用Express来响应所有请求,而不会出现任何延迟
尽管我在项目中使用了异​​步方法,但是我读到的鼓励使用异​​步方法的文章并未深入解释原因。
同步方法可以避免使用callback hell
所以我很好奇,为什么不使用 sync 方法,因为它们都可以工作?使用一个或另一个会影响响应时间/性能吗?

最佳答案

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

当您需要执行受CPU限制的操作时,问题就开始了:这项任务可能需要很多时间。您需要拆分任务,只做一小部分,然后将其余任务安排到以后再执行,直到完成为止,也可以将其委派给其他服务器/进程。

如果您决定进行同步,则服务器在执行该工作时将不再处理任何请求。是的,您将避免回调 hell ,但是无论从头到尾都要花多长的时间,都会付出代价。如果您尝试处理大量连接,那将不是很好。

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
}

在“做某事”时,服务器应用程序将不处理任何其他传入请求。当然,当您的任务比较繁重且请求很多时,问题将很严重。

在严重的Node服务器中,您不需要同步循环,除非由于X动机它比异步解决方案的性能更好。因此,您将与setTimeout,setImmediate,process.nextTick,Promises等保持异步。并且,您可能采取的第一种方法是采用延续传递样式,这意味着传递要在工作完成后执行的回调,以及可能您会碰到回调 hell 墙。

那就是您使用Promises或Generator或两者同时使用的时刻:
https://davidwalsh.name/async-generators

这样,您将避免回调 hell ,并获得更好的代码(主观)。另外,您可能想关注async / await:https://github.com/tc39/ecmascript-asyncawait

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

阿布拉佐

09-11 18:02