怎么能让node一个请求多个返回_他们为什么说Node.js很快?

96a6f478bd856445acd51f509dc87da3.png

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

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

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

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

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

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

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

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

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

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

2dba31a253a8f125ae0c0f08c99d4f49.png

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值