Node.js-HTTP保持活动和线程池

时间:2018-08-23 18:47:56

标签: node.js

我有几个问题,希望您能提供帮助。

Node.js使用单线程事件循环,并且默认情况下有一个由 4 个线程组成的线程池。

假设我将Node.js用作Web服务器,并且启用了 Keep-alive (保持活动)并且设置为空闲状态,直到关闭连接之前2秒钟。

如果有 8 个唯一的客户端试图访问我的网站页面,则只有 4 人才能看到该页面,直到线程中的一个客户端关闭连接为止?

如果不能,请解释原因?

1 个答案:

答案 0 :(得分:0)

答案是否定的-一个线程可以服务许多客户。

TLDR; 这是因为Node.js使用异步I / O

Node.js使用了两项技术-libuv和v8

  • v8 是Google Chrome和其他浏览器使用的Javascript引擎(现在对我们来说并不有趣)。
  • libuv 是一个提供事件循环和异步I / O功能的库

什么是事件循环?

通常来说,这是一个循环,它轮询或查询某些(通常是外部的)事件源,并为在接收到事件时执行的每个事件回调。像这样:

while (running) {
  event = get_event();
  callback = get_callback(event)
  callback();
}

如果我们这样做fs.read()socket.write()setTimeout() ...

在后台,这将“安排”事件与将来将要完成的回调(使用回调)-但代码不会等待每个单独的事件,而是仅将第一个事件等待(无论哪个先完成)。

因此get_event将返回第一个完成的事件。

什么是异步I / O?

例如,从文件中读取通常被称为阻塞操作-意味着我们从文件中请求x个字节,然后我们将阻塞执行,直到OS给我们字节为止。这是同步I / O。

使用异步I / O,可以要求OS给我们字节,而不阻塞,以便我们可以做其他事情。当字节准备好时,我们将通过事件循环得到通知并对其进行处理-所谓的非阻塞操作。

Node正是这样做的-它主要使用非阻塞操作来在单个线程上实现并发性。可以使用OS的异步I / O来处理文件和使用网络。

这非常有用,因为I / O操作通常占用大部分执行时间,因此我们的代码(而不是等待)正在做一些有用的事情-例如处理来自第8或第100客户端的连接。