Node.js 事件循环中的轮询阶段是什么
在Node.js事件循环中,轮询阶段是事件循环处理轮询队列中的事件的时间。轮询队列包含了准备处理的事件,比如等待接受的新连接或者从网络套接字接收到的数据。
在轮询阶段,事件循环将遍历轮询队列中的事件,并将其交给适当的事件处理程序进行处理。如果轮询队列为空,事件循环将阻塞并等待新的事件被添加到队列中。
在轮询阶段完成后,事件循环将进入检查阶段,在该阶段处理准备执行的setImmediate()回调。然后事件循环将返回到轮询阶段处理被添加到队列中的新事件。
Node.js事件循环的轮询阶段有两个主要功能:
1. 确定阻塞和轮询I/O事件的时间: 当事件循环进入轮询阶段时,它将阻塞并等待新的事件被添加到轮询队列中。事件循环阻塞和等待新事件的时间长度由setTimeout()函数中的poll参数的值确定。如果poll的值为-1,事件循环将无限期地阻塞直到有新的事件可用。如果poll的值是一个正数,事件循环将阻塞指定的毫秒数,在进入事件循环的下一个阶段之前。
2. 处理轮询队列中的事件: 在事件循环确定阻塞和轮询新事件的时间后,它将遍历轮询队列中的事件,并将其交给适当的事件处理程序进行处理。这是您编写的大部分JavaScript代码将被执行的地方,从代码的顶部开始,按顺序向下执行。
如果在事件循环到达轮询阶段时没有设置定时器,可能会发生以下两种情况之一:
- 如果轮询队列不为空: 事件循环将遍历队列,同步运行队列中的回调,直到队列耗尽或达到系统相关的硬限制。
- 如果没有使用setImmediate()调度脚本: 事件循环将等待回调被添加到队列中,然后执行它们。
什么是长轮询? 我用三个简单的要点来解释:
1. 长轮询是一种在客户端和服务器之间建立稳定连接的技术,而无需使用WebSocket或服务器推送事件等协议。在长轮询中,客户端发送请求至服务器,服务器仅当有新的特定信息时才会做出响应。在此期间,连接保持打开状态。
2. 客户端可以在服务器响应后立即发送另一个请求,并且服务器将在数据可用时返回响应。当客户端关闭连接并服务器发送请求时,该过程将重新开始。
3. 在Node.js中,长轮询可以通过保持客户端和服务器之间的连接打开,直到服务器有完整的数据来响应。在连接打开期间,客户端在发送另一个请求之前一直等待服务器响应数据。
长轮询可以通过在客户端上创建一个事件循环,在空闲时间或进行新请求时向服务器发送请求来进行配置。
示例: 这个示例代码展示了整个轮询过程:
const net = require('net');
const server = net.createServer(socket => {
// This function is the event handler
// for incoming connections.
// It will be called for each new
//connection that is received.
console.log('New connection received:', socket.remoteAddress);
// ... handle requests from the client here ...
});
server.listen(3000, () => {
console.log('Server listening on port 3000');
});
输出:
Server listening on port 3000
New connection received: [remote address]
在这个示例中,调用 net.createServer() 创建了一个新的服务器,并注册了一个事件处理函数,用于处理每个传入的连接。当使用 listen() 方法启动服务器时,它开始监听传入的连接 端口3000 。当一个新的连接被接收时,事件处理函数被调用,并传递一个表示连接的套接字对象。这个事件被添加到轮询队列中,在轮询阶段事件循环将处理它。