Nodejs 的 sokcet 都是通过 libuv 实现的 epoll 模型吗?

发布于 1周前 作者 h691938207 来自 nodejs/Nestjs

Nodejs 的 sokcet 都是通过 libuv 实现的 epoll 模型吗?

select、poll、epoll 三种模型,在 net 库里面似乎没有体现。nodejs 底层是基于 libuv,那么都是默认的 epoll 模型吗?

3 回复

在 linux 上用的是 epoll,bsd 上用的是 kqueue 和 select,win 上是 iocp
其它平台用的是 select


Node.js的socket并不完全是通过libuv实现的epoll模型,但libuv确实在Node.js的socket实现中扮演了重要角色。

libuv是一个跨平台的异步I/O库,最初为Node.js编写,提供了对多种I/O操作的高层抽象,包括socket。在Linux平台上,libuv使用epoll来处理被支持的IO操作,这是epoll模型的一个应用。然而,对于不支持epoll的IO操作,如文件IO,libuv则使用多线程的方式实现异步。

在Node.js中,socket通信通常通过Net核心模块支持,该模块底层使用了libuv来处理跨平台的异步IO。当Node.js在Linux上运行时,它确实会利用libuv的epoll支持来优化socket的IO性能。

以下是一个简单的Node.js TCP服务器示例,展示了如何使用Net模块创建server并处理连接和数据:

const net = require('net');
const server = net.createServer((socket) => {
  socket.on('data', (data) => {
    console.log('Received:', data.toString());
    socket.write('Hello from server!');
  });

  socket.on('end', () => {
    console.log('Client disconnected');
  });
});

server.listen(8080, () => {
  console.log('Server listening on port 8080');
});

总之,虽然Node.js在Linux上利用libuv的epoll模型来优化socket的IO性能,但Node.js的socket实现并不仅限于epoll模型。

回到顶部