为什么Node JS需要LIBUV?

时间:2019-05-19 07:24:08

标签: c++ node.js v8 libuv

所以,这个问题可能是新手和新手都无法提出,但是我仍然不知道LIBUV为什么在Node JS Architecture中占有一席之地?这就是我对NodeJs架构的理解。

  1. 节点Js是基于 V8
  2. 构建的
  3. V8能够运行以 EcmaScript标准编写的代码。
  4. V8用C ++编写。
  5. 因此,如果您想提供任何新功能,我们可以将V8嵌入到C ++项目中,并使用C ++中的新Embedded V8附加新代码。

现在这是个疑问,

  1. 由于 V8 支持 EcmaScript Javascript ,这意味着它具有运行使用EcmaScript标准编写的回调的功能。
  2. 所以我们可以在C ++中添加用于文件系统访问,Http服务器和DB访问的代码,因为有一些库(头文件)提供了该功能,因为Java是用C ++编写的(如果我错了,请纠正我),而Java具有能够做到这一点。
  3. 现在,如果我们可以在C ++中添加这些功能,那么Libuv在NodeJs架构中的位置在哪里。

预先感谢和 快乐编码:)

2 个答案:

答案 0 :(得分:2)

查看下面的文档-

https://nodejs.org/en/docs/meta/topics/dependencies/#libuv

  

另一个重要的依赖项是libuv,这是一个C库,用于   将非阻塞I / O操作抽象为跨接口的一致接口   所有支持的平台。它提供了处理文件系统的机制,   DNS,网络,子进程,管道,信号处理,轮询和   流媒体。它还包括一个线程池,用于分担某些工作   在操作系统上不能异步完成的事情   级别。

因此,总而言之,V8提供了与运行JS文件有关的功能,但是要使用网络,文件等系统资源,则使用libuv。它还提供了用于访问提到的资源的线程模型。

答案 1 :(得分:0)

libuv模块的职责与标准库中的某些特定功能有关。对于某些标准库函数调用,节点C ++端和libuv决定完全在事件循环之外进行昂贵的计算。它们创建了一个称为线程池的东西,该线程池是一系列四个线程,它们可以用于运行诸如哈希函数之类的计算密集型任务。

默认情况下,libuv在此线程池中创建四个线程。因此,这意味着除了用于事件循环的线程外,还有四个其他线程可用于卸载需要在应用程序内部进行的昂贵计算。节点标准库中包含的许多功能将自动使用此线程池。

现在,此线程池的存在非常重要。很清楚,Node.js并不是真正的单线程


Libuv还使节点可以访问操作系统的基础文件系统,例如网络。因此,就像节点标准库具有利用libuv线程池的某些功能一样,它也具有利用libuv内置于底层操作系统中的代码的某些功能。

简单的Http请求

const https=require(“https”)
const start=Date.now()
https.request(“https://www.google.com”,res=>{
res.on(“data”,()=>{} ) 
res.on(“end”,()=>{console.log(Date.now()-start)  }) }).end()

因此,在这种情况下,libuv看到我们正在尝试发出HTTP请求。 libuv和node都没有任何代码来处理网络请求所涉及的所有这些低级操作。相反,libuv将发出的请求委派给基础操作系统。因此,实际上是由我们的操作系统执行真正的HTTP请求Libuv用于发出请求,然后它仅等待操作系统发出信号,表明某些响应已返回到该请求。因此,由于Libuv将工作委托给操作系统,因此操作系统本身将决定是否提出新的威胁。或者只是通常如何处理发出请求的整个过程。