Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js-HTTP保持活动状态和线程池_Node.js - Fatal编程技术网

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

Node.js-HTTP保持活动状态和线程池,node.js,Node.js,我有几个问题希望你能帮忙 Node.js使用单线程事件循环,默认情况下,有一个由4个线程组成的线程池 假设我使用Node.js作为web服务器,并且在关闭连接之前,保持活动状态已启用,并设置为空闲2秒 如果有8个唯一的客户端试图访问我的网站页面,在线程中的一个客户端关闭连接之前,只有4个能够看到该页面吗 如果不是,你能解释一下原因吗 答案是没有一个线程可以为多个客户端服务 TLDR这是因为Node.js使用异步I/O UndertheHood Node.js使用两种技术—libuv和v8 v8

我有几个问题希望你能帮忙

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

假设我使用Node.js作为web服务器,并且在关闭连接之前,保持活动状态已启用,并设置为空闲2秒

如果有8个唯一的客户端试图访问我的网站页面,在线程中的一个客户端关闭连接之前,只有4个能够看到该页面吗


如果不是,你能解释一下原因吗

答案是没有一个线程可以为多个客户端服务

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

UndertheHood 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,可以要求操作系统为我们提供字节和不阻塞,以便我们可以做其他事情。当字节准备就绪时,我们将收到事件循环的通知并对其进行处理,这就是所谓的非阻塞操作

节点正是这样做的-它主要使用非阻塞操作在单个线程上实现并发性。操作文件和使用网络可以通过操作系统的异步I/O来完成

它非常有用,因为I/O操作通常占用大部分执行时间,所以我们的代码不用等待,而是在做一些有用的事情,比如处理来自第8个或第100个客户端的连接