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