Nodejs事件循环

Tamil提出了一个问题:Nodejs Event Loop,或许与您遇到的问题类似。

回答者Talha AwanShrekOverflow给出了该问题的处理方式:

I have been personally reading the source code of node.js & v8.

I went into similar problem like you when I tried to understand node.js architecture in order to write native modules.

What I am posting here is my understanding of node.js and this might be a bit off track as well.

  1. Libev is the event loop which actually runs internally in node.js to perform simple event loop operations. It's written originally for *nix systems. Libev provides a simple yet optimized event loop for the process to run on. You can read more about libev here.

  2. LibEio is a library to perform input output asynchronously. It handles file descriptors, data handlers, sockets etc. You can read more about it here here.

  3. LibUv is an abstraction layer on the top of libeio , libev, c-ares ( for DNS ) and iocp (for windows asyncronous-io). LibUv performs, mantains and manages all the io and events in the event pool. ( in case of libeio threadpool ). You should check out Ryan Dahl's tutorial on libUv. That will start making more sense to you about how libUv works itself and then you will understand how node.js works on the top of libuv and v8.

To understand just the javascript event loop you should consider watching these videos

To see how libeio is used with node.js in order to create async modules you should see this example.

Basically what happens inside the node.js is that v8 loop runs and handles all javascript parts as well as C++ modules [ when they are running in a main thread ( as per official documentation node.js itself is single threaded) ]. When outside of the main thread, libev and libeio handle it in the thread pool and libev provide the interaction with the main loop. So from my understanding, node.js has 1 permanent event loop: that's the v8 event loop. To handle C++ async tasks it's using a threadpool [via libeio & libev ].

For example:

--------------------------------------------

Which appears in all modules is usually calling the function Task in the threadpool. When it's complete, it calls the AfterTask function in the main thread. Whereas Eio_REQUEST is the request handler which can be a structure / object whose motive is to provide communication between the threadpool and main thead.

希望本文对你有帮助,欢迎支持JavaScript中文网

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/10710


猜你喜欢

  • 动画:从 AE 到 Web | Aotu.io「凹凸实验室」

    动画是网页设计中不可或缺的一部分,能够提高用户体验和吸引用户的注意力。许多优秀的网站都使用了令人印象深刻的动画效果来吸引用户。 在这篇文章中,我们将介绍如何使用 Adobe After Effects...

    7 年前
  • 原生js数据绑定

    原生 JS 数据绑定 在前端开发中,数据绑定是一个非常重要的概念。它指的是将数据模型与视图进行关联,使得当数据变化时,视图能够自动更新。这种技术可以提高开发效率、降低代码复杂度,并且增强了用户体验。

    7 年前
  • 当检测到一个窗口使用JavaScript呢?

    当我们在开发前端应用程序时,经常需要检测用户是否已启用 JavaScript。这是因为 JavaScript 是网页开发中的重要组成部分,但如果用户没有启用 JavaScript,可能会影响我们应用程...

    7 年前
  • 下划线的外部模板

    在前端开发中,我们经常会使用下划线(underscore)这个库来处理数据和编写模板。但是,在一些特殊的情况下,使用下划线提供的内嵌模板可能无法满足需求,这时候我们可以使用“下划线的外部模板”。

    7 年前
  • 警告警告:时刻建设落回到 JS Date

    在前端开发中,处理日期和时间是很常见的任务。JavaScript 提供了内置的 Date 对象来处理日期和时间。然而,使用 Date 对象的方式可能会导致一些潜在的问题,特别是在涉及时区和跨越时间边界...

    7 年前
  • 如何在JavaScript中读取外部本地JSON文件

    JSON是一种轻量级的数据交换格式,广泛用于前端和后端应用程序之间的数据传输。在开发中,我们通常需要从外部文件中读取JSON数据,然后在应用程序中使用这些数据。本文将介绍如何在JavaScript中读...

    7 年前
  • 控制器不是一个函数,而是未定义的,而全局定义控制器

    在前端开发中,我们经常会听到“控制器”这个术语。通常情况下,我们把它当做一个函数来看待,用于控制页面上的逻辑和交互。然而,在 AngularJS 中,控制器并不是一个函数,而是一个未定义的对象。

    7 年前
  • 如何在jQuery元素的n级家长中查找?

    当我们需要操作一个特定的DOM元素时,有时候需要在其父元素中进行查找而不是直接选择它。jQuery提供了多种方法来实现这一目的,本文将介绍如何在jQuery元素的n级家长中查找。

    7 年前
  • 将参数传递到 JavaScript 文件

    在前端开发中,我们经常需要将参数传递到 JavaScript 文件中。这个过程可能涉及到多种技术,本文将从不同的角度介绍如何实现参数传递,并提供示例代码。 1. 使用全局变量 在 JavaScript...

    7 年前
  • 如何使用Ajax文件上传表单

    在前端开发中,常常需要实现文件上传功能。传统的方式是使用 <form> 标签提交表单,但这种方式会刷新整个页面,用户体验不够友好。而使用 Ajax 文件上传可以无需刷新页面,实现异步上传,...

    7 年前
  • 用JavaScript缩短长字符串的聪明方法

    在前端开发中,经常需要处理较长的字符串。当这些字符串需要在页面上展示时,可能会占用大量的空间,影响用户体验。因此,我们需要一些方法来缩短这些字符串,使其在页面上更加美观和易于阅读。

    7 年前
  • JavaScript的多维数组

    在JavaScript中,数组可以包含任何类型的数据,并且可以轻松地创建和操作多维数组。多维数组是一个数组,其中每个元素都是另一个数组。 创建多维数组 为了创建一个多维数组,您需要在数组中嵌套其他数组...

    7 年前
  • 防止HTML5视频被下载(右键保存)?

    在前端开发中,我们经常需要使用HTML5视频来展示内容。但是,一旦视频文件被下载或者盗用,就会对版权造成侵害。为了保护视频版权,我们需要采取措施防止HTML5视频被下载。

    7 年前
  • 输入类型=file 只显示按钮的实现

    在前端开发中,我们常常需要上传文件。为了让用户方便地选择要上传的文件,HTML 提供了 <input type="file"> 元素,但是默认情况下会显示一个文本输入框和一个按钮。

    7 年前
  • 在IE9中使用JavaScript和VBScript

    在Web开发中,JavaScript是一种流行的脚本语言,而VBScript则是一种被忽视的脚本语言。在IE9及更早的版本中,两种语言都可以被使用。本文将介绍如何在IE9中使用JavaScript和V...

    7 年前
  • 如何在 HTML 画布上找到文本的高度?

    在前端开发中,我们通常需要在 Canvas 上绘制文本。但是,为了实现一些特定的效果,有时需要知道文本的高度。那么如何在 HTML 画布上找到文本的高度呢?下面将详细介绍该过程。

    7 年前
  • 两个对象之间的通用深度差异

    在前端开发中,经常需要比较两个对象是否相等。然而,在实际应用中,相同属性但深度不同的对象也被认为是不相等的。因此,了解两个对象之间的通用深度差异是非常重要的。 深度差异的定义 对于两个对象 obj1 ...

    7 年前
  • 如何实现 iframe 和父站点之间的通信?

    在 Web 前端开发中,我们经常需要使用 iframe 来嵌入外部页面。但是,由于浏览器同源策略的限制,iframe 内的页面无法直接与父级页面进行通信。本文将介绍如何通过几种方法实现 iframe ...

    7 年前
  • 如何使用 jQuery 检测页面的滚动位置

    在前端开发中,我们经常需要检测页面的滚动位置来实现一些效果,比如懒加载、无限滚动等。本文将介绍如何使用 jQuery 检测页面的滚动位置,并提供示例代码。 获取滚动位置 jQuery 提供了两种方式获...

    7 年前
  • 为JavaScript删除带下划线的重复对象

    在前端开发中,我们经常会遇到需要从一个数组中删除重复对象的情况。但是,由于JavaScript中的对象是引用类型,因此很难直接使用Array.indexOf()或Array.includes()来进行...

    7 年前

相关推荐

    暂无文章