Node.js 事件循环中的轮询阶段是什么

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 。当一个新的连接被接收时,事件处理函数被调用,并传递一个表示连接的套接字对象。这个事件被添加到轮询队列中,在轮询阶段事件循环将处理它。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程