一尘不染

Nodejs事件循环

node.js

nodejs体系结构内部是否存在两个事件循环?

  • libev / libuv
  • v8 javascript事件循环

在I / O请求上,节点是否将请求排队到libeio,而libeio又通过使用libev的事件通知数据的可用性,最后这些事件由v8事件循环使用回调来处理?

基本上,libev和libeio如何集成到nodejs架构中?

是否有任何文档可以清楚地了解nodejs内部体系结构?


阅读 248

收藏
2020-07-07

共1个答案

一尘不染

我一直在亲自阅读node.js&v8的源代码。

当我试图了解node.js架构以编写本机模块时,遇到了类似的问题。

我在这里发布的内容是我对node.js的理解,这可能也有些偏离轨道。

  1. Libev是事件循环,它实际上在node.js内部运行,以执行简单的事件循环操作。它最初是为* nix系统编写的。Libev为运行该流程提供了一个简单而优化的事件循环。您可以在此处阅读有关libev的更多信息。

  2. LibEio是一个用于异步执行输入输出的库。它处理文件描述符,数据处理程序,套接字等。您可以在这里阅读有关它的更多信息。

  3. LibUv是libeio,libev,c-ares(对于DNS)和iocp(对于Windows异步-io)顶部的抽象层。LibUv执行,维护和管理事件池中的所有io和事件。(如果是libeio线程池)。您应该查看关于libUv的Ryan Dahl的教程。这将使您对libUv本身的工作方式更加了解,然后您将了解node.js在libuv和v8之上的工作方式。

要仅了解javascript事件循环,您应该考虑观看这些视频

要查看libeio如何与node.js一起使用以创建异步模块,您应该看到此示例

基本上,node.js内部发生的事情是v8循环运行并处理所有javascript部分以及C
模块[当它们在主线程中运行时(根据官方文档,node.js本身是单线程的)]。当在主线程之外时,libev和libeio在线程池中对其进行处理,并且libev提供与主循环的交互。因此,据我了解,node.js具有1个永久事件循环:这就是v8事件循环。为了处理C
异步任务,它使用一个线程池[通过libeio和libev]。

例如:

eio_custom(Task,FLAG,AfterTask,Eio_REQUEST);

在所有模块中出现的通常是Task在线程池中调用该函数。完成后,它将AfterTask在主线程中调用该函数。而Eio_REQUEST请求处理程序可以是结构/对象,其目的是在线程池和主线程之间提供通信。

2020-07-07