nodejs体系结构内部是否存在两个事件循环?
在I / O请求上,节点是否将请求排队到libeio,而libeio又通过使用libev的事件通知数据的可用性,最后这些事件由v8事件循环使用回调来处理?
基本上,libev和libeio如何集成到nodejs架构中?
是否有任何文档可以清楚地了解nodejs内部体系结构?
我一直在亲自阅读node.js&v8的源代码。
当我试图了解node.js架构以编写本机模块时,遇到了类似的问题。
我在这里发布的内容是我对node.js的理解,这可能也有些偏离轨道。
Libev是事件循环,它实际上在node.js内部运行,以执行简单的事件循环操作。它最初是为* nix系统编写的。Libev为运行该流程提供了一个简单而优化的事件循环。您可以在此处阅读有关libev的更多信息。
LibEio是一个用于异步执行输入输出的库。它处理文件描述符,数据处理程序,套接字等。您可以在这里阅读有关它的更多信息。
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请求处理程序可以是结构/对象,其目的是在线程池和主线程之间提供通信。
Task
AfterTask
Eio_REQUEST