首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

他们为什么说Node.js很快?

为了解释这一点,我们首先需要了解通常如何处理Web请求。例如,让我们选择PHP。假设你有一个注册页面。用户单击“注册页面”后,将发生以下情况:

1、它检查数据库中是否已经存在使用该电子邮件的用户。

2、它在数据库中创建一个用户。

3、它向用户发送欢迎电子邮件,然后将用户重定向到登录页面。

代码本身是很快,但是它依赖于其他资源:它具有两个依赖于数据库的操作和一个依赖于外部服务(Mailgun,Postmark,Amazon SES等)的操作。

这意味着代码是同步的。也就是说,你必须等到每个操作完成后才能进行下一个操作。这也意味着在所有操作完成之前,进程将被挂起。假设整个过程需要5秒钟(我在这里夸大了)在这种情况下,服务器堵塞了。在前一个请求完成之前,它将无法处理另一个请求。为了解决这个问题,它会产生一个新的进程来处理第二个请求。如果在此期间收到第三个请求,则会产生另一个进程。这对于应用程序的所有 routes均有效,因此,如果用户请求另一个页面,那它还需要另一个过程。它不能同时处理。不过你可以在你的服务器上快速检查,然后单击多个链接,你将会看到生成的进程。

简而言之,代码本身不需要花费很多的时间就可以运行,但它取决于外部资源,并且直到这些资源完成后才会挂起。它是同步的。

对于大多数应用程序而言,这根本就不是问题,因为数据库调用往往非常快,并且诸如向API发出请求(在这种情况下多为发送电子邮件)之类的外部事件可以被放入队列并分别处理。

不知道你们熟不熟悉javascript中的回调,我们将它们用于Ajax请求setTimeout等。Node在等待I / O操作时会设法处理其他请求。

例如我们的数据库需要花费几秒钟来响应,则其它的所有请求都将被阻止,但是你可以将回调传递给DB调用,并让Node知道它不应该阻止服务器并仅解决该某一问题。例如,这是异步/非阻塞代码的示例:

运行代码你会得到first和third,但比second稍晚一点。发生这种情况的原因是,尽管我们告诉Javascript在执行某件事之前要等待1000毫秒,但同时我们也告诉它这是一个异步操作,因此它可以运行其余代码,然后返回回调。

因此,基本上这就是后端发生的情况。当你进行I / O操作时,Node只会处理其他请求,并在操作完成后再返回其他的请求。这就是它以非阻塞方式同时处理多个请求的方式。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200618A0GQNR00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券