我有几个问题,希望您能提供帮助。
Node.js使用单线程事件循环,并且默认情况下有一个由 4 个线程组成的线程池。
假设我将Node.js用作Web服务器,并且启用了 Keep-alive (保持活动)并且设置为空闲状态,直到关闭连接之前2秒钟。
如果有 8 个唯一的客户端试图访问我的网站页面,则只有 4 人才能看到该页面,直到线程中的一个客户端关闭连接为止?
如果不能,请解释原因?
答案 0 :(得分:0)
答案是否定的-一个线程可以服务许多客户。
TLDR; 这是因为Node.js使用异步I / O
Node.js使用了两项技术-libuv和v8
什么是事件循环?
通常来说,这是一个循环,它轮询或查询某些(通常是外部的)事件源,并为在接收到事件时执行的每个事件回调。像这样:
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客户端的连接。