nodejs事件监听实现原理?
发布于 7 年前 作者 lanfengZhou 4230 次浏览 来自 问答

感觉不是很理解nodejs事件监听的实现原理,它的实现和进程或线程有关系吗?本来是想用nodejs实现像java一样的TCP服务器,看到java代码中对新连接成功的socket,都会开一个新的线程来处理socket的接收信息;而在nodejs中,感觉对每个连接成功的socket都会注册一个事件监听事件,会对每个socket监听,感觉已经用不到线程来处理接收信息,请大家指教,多谢!!!

7 回复

实际上 建立长连接时(比如websocket)的时候 nodejs 也是要监听这个线程的,注册的那些事件是在当事件触发时,做相应逻辑。

朴灵大大的书里面有些,执行javascript的代码是在一个单线程上,I/O事件在线程池上处理

来自酷炫的 CNodeMD

@q86002618 也就是说这些I/O事件的底层实现,也是有某个线程来维护

@yuk320 我倒还没试过建立一个长连接,只是在socket通信时,感觉会为每个连接成功的socket注册监听事件,事件监听也是一直都在,而不是像java中需要有一个线程来维护处理消息,这个事件监听的实现原理是不是也是需要线程来维护?

观察者模式吗 来自 牛读

为了回答你的这个问题,我查阅了一些资料:

从系统提供的回调函数来说,这些回调函数会被注册在Node的事件循环中。在时间循环中异步的处理IO事件,其中IO时间分为:

  • Network I/O是使用系统提供的非阻塞式I/O解决方案,例如在Linux上使用epoll,windows上使用IOCP。
  • 文件操作和DNS操作没有(很好的)系统解决方案,因此libuv自建了线程池,在其中进行阻塞式I/O。

事件处理完毕后,触发一开始注册的回调函数。

这样就实现了你在问题中提出的事件监听。

就例如

socket.on('data',function(){
});

这里的function就会被注册在事件循环中,i/o返回时将调用这里的function.

参考资料:https://github.com/yjhjstz/deep-into-node/blob/master/chapter5/chapter5-1.md

回到顶部