nodejs架构内部有两个事件循环吗?
在I/O请求上,节点是否将请求排队到libeio,而libeio又通过libev通过事件通知数据的可用性,最后这些事件由v8事件循环使用回调来处理?
基本上,libev和libeio是如何在nodejs架构中集成的?
是否有任何文档可以清晰地描述nodejs的内部架构?
发布于 2012-06-18 12:02:27
我本人一直在阅读node.js & v8的源代码。
当我试图理解node.js体系结构以编写本机模块时,我遇到了类似的问题,就像您一样。
我在这里发布的是我对node.js的理解,这也可能有点偏离轨道。
要理解javascript事件循环,您应该考虑观看这些视频。
要了解libeio如何与node.js一起使用以创建异步模块,您应该看到这个例子。
基本上,node.js内部发生的事情是,v8循环在主线程中运行和处理所有javascript部分以及C++模块(根据官方文档,node.js本身是单线程的)。在主线程外部时,libev和libeio在线程池中处理它,libev提供与主循环的交互。因此,据我理解,node.js有一个永久事件循环:那就是v8事件循环。为了处理C++异步任务,它通过libeio & libev使用线程池。
例如:
eio_custom(Task,FLAG,AfterTask,Eio_REQUEST);它出现在所有模块中,通常是调用线程池中的函数Task。当它完成时,它在主线程中调用AfterTask函数。而Eio_REQUEST是请求处理程序,它可以是一个结构/对象,其目的是提供线程池和主线程之间的通信。
发布于 2016-04-26 08:34:01
看起来像讨论过的一些实体(例如: libev等)已经失去了相关性,因为它已经有一段时间了,但我认为这个问题仍然有很大的潜力。
让我尝试通过一个抽象示例,在Node的上下文中,从今天开始,在抽象UNIX环境中解释事件驱动模型的工作原理。
项目的视角:
上面的事件机制称为libuv事件循环框架。节点利用此库实现其事件驱动编程模型。
Node的观点:
虽然大多数功能都是以这种方式提供的,但一些文件操作(异步版本)是在其他线程的帮助下执行的,这些线程很好地集成到libuv中。虽然网络I/O操作可以等待外部事件,如另一个端点响应数据等,但文件操作需要节点本身的一些工作。例如,如果您打开一个文件并等待fd准备好数据,它将不会发生,因为没有人正在实际读取!同时,如果您从主线程中的文件内联中读取,它可能会阻止程序中的其他活动,并会造成明显的问题,因为与cpu绑定的活动相比,文件操作非常慢。因此,内部工作线程(通过UV_THREADPOOL_SIZE环境变量可配置)用于对文件进行操作,而从程序的角度来看,事件驱动的抽象工作是完整的。
希望这能有所帮助。
发布于 2016-01-02 13:15:04
libuv简介
node.js项目始于2009年,当时JavaScript环境与浏览器脱钩。使用谷歌的V8和马克·莱曼( Marc )的利别夫,node.js将I/O模型--偶发--与一种非常适合编程风格的语言结合在一起,因为它是由浏览器形成的。随着node.js的普及,让它在Windows上运行是很重要的,但是libev只在Unix上运行。Windows等效于内核事件通知机制(如kqueue或(E)轮询)是IOCP。libuv是基于平台的libev或IOCP的抽象,为用户提供了基于libev的API。在节点-v0.9.0版本的libuv 利别夫中。
还有一张图片描述了Node.js中的事件循环(通过@BusyRich )

更新05/09/2017
根据Node.js事件循环医生的说法,
下图显示了事件循环操作顺序的简化概述。
┌───────────────────────┐
┌─>│ timers │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ I/O callbacks │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ idle, prepare │
│ └──────────┬────────────┘ ┌───────────────┐
│ ┌──────────┴────────────┐ │ incoming: │
│ │ poll │<─────┤ connections, │
│ └──────────┬────────────┘ │ data, etc. │
│ ┌──────────┴────────────┐ └───────────────┘
│ │ check │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
└──┤ close callbacks │
└───────────────────────┘注意:每个框将被称为事件循环的“阶段”。
阶段概述
setTimeout()和setInterval()计划的回调。setImmediate()除外。setImmediate()回调。socket.on('close', ...)。在事件循环的每次运行之间,Node.js检查它是否在等待任何异步I/O或计时器,如果没有任何异步I/O或定时器,则彻底关闭。
https://stackoverflow.com/questions/10680601
复制相似问题