所以,这个问题可能是新手和新手都无法提出,但是我仍然不知道LIBUV为什么在Node JS Architecture中占有一席之地?这就是我对NodeJs架构的理解。
现在这是个疑问,
预先感谢和 快乐编码:)
答案 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将工作委托给操作系统,因此操作系统本身将决定是否提出新的威胁。或者只是通常如何处理发出请求的整个过程。