Aze*_*edo 2 javascript node.js express
在nodeJS中,通常的做法和建议是使用异步方法并回调下一个函数。
我使用expressJS设置了一个nodeJS 进行测试,并编写了sync和async方法。无论使用异步方法还是同步方法,这两种方法都适用,表达方式都将在没有任何明显延迟的情况下答复所有请求。
尽管我在项目中使用了异步方法,但我读过的鼓励使用的文章异步方法的文章并未深入解释原因。 同步方法可以避免回调地狱。
所以我很好奇,为什么不使用同步方法,因为它们都可以工作?使用一个或另一个会影响响应时间/性能吗?
节点在单个线程上运行。如果要处理大量连接,则与CPU绑定的任务相比,与IO绑定的任务肯定会更多。例如,数据库调用。在等待数据库查询结果时,您可以接收更多请求或执行其他作业。
当您需要执行受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
}
Run Code Online (Sandbox Code Playgroud)
在“做某事”时,服务器应用程序将不处理任何其他传入请求。当然,当您的任务比较繁重且有很多请求时,问题将很严重。
在严重的Node服务器中,您不需要同步循环,除非由于X动机它比异步解决方案的性能更好。因此,您将与setTimeout,setImmediate,process.nextTick,Promises等保持异步。而且,您可能采取的第一种方法是采用延续传递样式,这意味着传递要在工作完成后执行的回调,以及可能您会碰到回调地狱墙。
那就是您使用Promises或Generators或两者同时使用的时刻:https : //davidwalsh.name/async-generators
这样,您将避免回调地狱,并获得更好的代码(主观)。另外,您可能想关注async / await:https : //github.com/tc39/ecmascript-asyncawait。
您没有任何明显的优势,因为您是发出请求的唯一用户。使用数千个连接进行测试。
阿布拉佐
| 归档时间: |
|
| 查看次数: |
929 次 |
| 最近记录: |